線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,例如,線程等待和通知機(jī)制就是線程通訊的主要手段之一。
在 Java 中,線程等待和通知的實(shí)現(xiàn)手段有以下幾種方式:
為什么一個(gè)線程等待和通知機(jī)制就需要這么多的實(shí)現(xiàn)方式呢?
別著急,咱們先來看實(shí)現(xiàn),再來說原因。
Object 類的方法說明:
示例代碼如下:
Object lock = new Object();// 創(chuàng)建線程并執(zhí)行new Thread(() -> { System.out.println("線程1:開始執(zhí)行"); synchronized (lock) { try { System.out.println("線程1:進(jìn)入等待"); lock.wait(); System.out.println("線程1:繼續(xù)執(zhí)行"); Thread.sleep(3000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("線程1:執(zhí)行完成"); }}).start();Thread.sleep(1000);synchronized (lock) { // 喚醒線程 System.out.println("執(zhí)行 notifyAll()"); lock.notifyAll();}Condition 類的方法說明:
示例代碼如下:
// 創(chuàng)建 Condition 對(duì)象Lock lock = new ReentrantLock();Condition condition = lock.newCondition(); // lock 下可創(chuàng)建多個(gè) Condition// 加鎖lock.lock();try { // 業(yè)務(wù)方法...... // 1.進(jìn)入等待狀態(tài) condition.await(); // 2.喚醒操作 condition.signal();} catch (InterruptedException e) { e.printStackTrace();} finally { lock.unlock();}LockSupport 類的方法說明:
PS:LockSupport 無需配鎖(synchronized 或 Lock)一起使用。
示例代碼如下:
public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { LockSupport.park(); System.out.println("線程1"); }, "線程1"); t1.start(); Thread t2 = new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("喚醒線程1"); LockSupport.unpark(t1); }, "線程2"); t2.start();}為什么一個(gè)線程等待和喚醒的功能需要這么多的實(shí)現(xiàn)呢?
// 創(chuàng)建 Condition 對(duì)象private Lock lock = new ReentrantLock();// 生產(chǎn)者的 Condition 對(duì)象private Condition producerCondition = lock.newCondition();// 本篇內(nèi)容出自磊哥《Java面試突擊訓(xùn)練營》 VX:GG_Stone// 消費(fèi)者的 Condition 對(duì)象private Condition consumerCondition = lock.newCondition();也就是 Condition 是 Object 等待喚醒模型的升級(jí),Object 類可以實(shí)現(xiàn)的功能它都能實(shí)現(xiàn),但 Condition 能實(shí)現(xiàn)的功能,Object 卻不能實(shí)現(xiàn),這就是 Condition 類存在的必要性。
那問題來了,為什么還有會(huì) Object 的 wait 和 notify 方法呢?因?yàn)?Object 類誕生的比較早,也就是說 Condition 和 LockSupport 都是 JDK 后期版本才出現(xiàn)的功能,所以就有了現(xiàn)在這么多線程喚醒和等待的方法了。
本文鏈接:http://m.www897cc.com/showinfo-26-77-0.html線程通訊的三種方法!通俗易懂
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 十個(gè)可以手動(dòng)編寫的 JavaScript 數(shù)組 API
下一篇: Rust中的高吞吐量流處理