Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
658
2025-04-03
4.1,線程通信機(jī)制
線程間同步可以歸納為線程間通信的子集,對于線程通信指的是兩個線程之間可以交換一些實(shí)時的數(shù)據(jù)信息。
線程是操作系統(tǒng)中獨(dú)立的個體,但這些個體如果不經(jīng)過特殊處理就不能成為一個整體,線程間的通信就成為整體的必用方式之一。
當(dāng)線程存在通信指揮,系統(tǒng)間的交互性會更強(qiáng)大,在提高CPU利用率的同時還會使開發(fā)人員對線程任務(wù)在處理過程中進(jìn)行有效的把控與監(jiān)督。
4.2,線程通信的wait和notify機(jī)制
wait/notify方法實(shí)現(xiàn)線程間的通信:
這兩個方法都是Object類的方法,換句話說Java為所有的對象都提供了這兩個方法。
Lock和Condition實(shí)現(xiàn)線程間的通信:
從Java 5開始,提供了Lock機(jī)制,同時還有處理Lock機(jī)制的通信控制的Condition接口。
線程通信的wait/notify機(jī)制:
等待/通知機(jī)制,是指線程A調(diào)用了對象的wait()方法進(jìn)入等待狀態(tài),而線程B調(diào)用了對象的notify()或notifyAll()方法,線程A收到通知后退出等待隊列,進(jìn)入可運(yùn)行狀態(tài),進(jìn)而執(zhí)行后續(xù)操作。
從功能上說wait就是說線程在獲取對象鎖后,主動釋放對象鎖,同時本線程休眠。直到有其他線程調(diào)用對象的notify()喚醒該線程,才能繼續(xù)獲取對象鎖,并繼續(xù)執(zhí)行。
wait()和notify()方法是Object類的方法。
線程通信案例:
class SumThread extends Thread { private int sum = 0; public void run() { synchronized (this) { for (int i = 0; i <= 100; i++) { sum += i; } /* * 算好后,通知和子線程持有同一個對象的鎖的被阻塞的線程解鎖繼續(xù)運(yùn)行 * 如果是當(dāng)前線程對象,默認(rèn)可以不寫this.notify(); * */ this.notify(); } } public int getSum() { return this.sum; } } public class Test { /* * 子線程計算1-100之和,算好后馬上通知主線程獲取計算的總和 * */ public static void main(String[] args) { SumThread st = new SumThread(); st.start(); synchronized (st) { try { System.out.println(Thread.currentThread().getName() + ",線程被阻塞"); //wait()和notify()是匹配,如果被wait(),一定要notify()喚醒解鎖 st.wait(); System.out.println(Thread.currentThread().getName() + ",線程收到的值為:" + st.getSum()); } catch (InterruptedException e) { e.printStackTrace(); } } } /* * 輸出結(jié)果 * main,線程被阻塞 main,線程收到的值為:5050 * */ }
4.3,線程通信的Lock和Condition機(jī)制
Lock和Condition通信機(jī)制:
Lock用于控制多線程對需要競爭的共享資源的順序訪問,保證該狀態(tài)的連續(xù)性。
Condition是Java提供了實(shí)現(xiàn)等待/通知的類,Condition對象是由Lock對象所創(chuàng)建的。
Condition中的await()方法相當(dāng)于Object的wait()方法,Condition中的signal()方法相當(dāng)于Object的notify()方法。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class UserThread extends Thread { private Lock lock; private Condition condition; private int sum = 0; public UserThread(Lock lock, Condition condition) { this.lock = lock; this.condition = condition; } public void run() { lock.lock(); for (int i = 0; i <= 100; i++) { sum += i; } condition.signal(); lock.unlock(); } public int getSum() { return sum; } } public class Test { public static void main(String[] args) { //1,創(chuàng)建鎖 ReentrantLock lock = new ReentrantLock(); //2,監(jiān)視器 Condition condition = lock.newCondition(); UserThread ut = new UserThread(lock, condition); ut.start(); lock.lock(); System.out.println(Thread.currentThread().getName() + "-->被阻塞"); try { condition.await(); System.out.println(Thread.currentThread().getName() + "-->" + ut.getSum()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } /* * 輸出結(jié)果 * main-->被阻塞 main-->5050 * */ } }
Java 多線程
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。