您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何使用Latch代替wait notify來進行通知,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
/** * 曾經的面試題:(淘寶?) * 實現一個容器,提供兩個方法,add,size * 寫兩個線程,線程1添加10個元素到容器中,線程2實現監控元素的個數,當個數到5個時,線程2給出提示并結束 * * 給lists添加volatile之后,t2能夠接到通知,但是,t2線程的死循環很浪費cpu,如果不用死循環,該怎么做呢? * * 這里使用wait和notify做到,wait會釋放鎖,而notify不會釋放鎖 * 需要注意的是,運用這種方法,必須要保證t2先執行,也就是首先讓t2監聽才可以 * * 閱讀下面的程序,并分析輸出結果 * 可以讀到輸出結果并不是size=5時t2退出,而是t1結束時t2才接收到通知而退出 * 想想這是為什么? * * notify之后,t1必須釋放鎖,t2退出后,也必須notify,通知t1繼續執行 * 整個通信過程比較繁瑣 * * 使用Latch(門閂)替代wait notify來進行通知 * 好處是通信方式簡單,同時也可以指定等待時間 * 使用await和countdown方法替代wait和notify * CountDownLatch不涉及鎖定,當count的值為零時當前線程繼續運行 * 當不涉及同步,只是涉及線程通信的時候,用synchronized + wait/notify就顯得太重了 * 這時應該考慮countdownlatch/cyclicbarrier/semaphore * @author mashibing */ package yxxy.c_019; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class MyContainer5 { // 添加volatile,使t2能夠得到通知 volatile List lists = new ArrayList(); public void add(Object o) { lists.add(o); } public int size() { return lists.size(); } public static void main(String[] args) { MyContainer5 c = new MyContainer5(); //門閂(當這個1變成0的時候,這個門閂就開了) CountDownLatch latch = new CountDownLatch(1); new Thread(() -> { System.out.println("t2啟動"); if (c.size() != 5) { try { //門閂等待不需要鎖定任何對象 latch.await(); //也可以指定等待時間 //latch.await(5000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("t2 結束"); }, "t2").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e1) { e1.printStackTrace(); } new Thread(() -> { System.out.println("t1啟動"); for (int i = 0; i < 10; i++) { c.add(new Object()); System.out.println("add " + i); if (c.size() == 5) { // 打開門閂,讓t2得以執行 latch.countDown(); } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1").start(); } }
關于如何使用Latch代替wait notify來進行通知就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。