色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Java多線程基礎 線程的等待與喚醒

瀏覽:69日期:2022-09-05 14:18:41

題圖:花啡,豆是買咖啡機送的,花是上周陽朔旅游買的桂花,給它起了個名字,叫 Sunday。

咖啡味淡了一點點,多了一份桂花的清香。

本篇我們來研究一下 wait() notify() notifyAll() 。

DEMO1: wait() 與 notify()

public class Test { static class ThreadOne extends Thread {private Callback mCallback;@Overridepublic void run() { work(); if (mCallback != null) {mCallback.onResult(false); }}// 耗時 3sprivate void work() { System.out.println(' 正在查詢數據庫 1'); long startTime = System.currentTimeMillis(); while (true) {if (System.currentTimeMillis() - startTime < 3000) { continue;}break; }}public void setCallback(Callback callback) { mCallback = callback;}public interface Callback { void onResult(boolean result);} } static class ThreadTest extends Thread {private Object mLock = new Object();private ThreadOne mThreadOne;@Overridepublic void run() { workOne(); System.out.println(' 根據結果繼續做其他事情 ');}private void workOne() { mThreadOne = new ThreadOne(); mThreadOne.setCallback(new ThreadOne.Callback() {@Overridepublic void onResult(boolean result) { System.out.println(' 查詢數據庫 1 結束,:' + (result ? ' 有數據 ' : ' 無數據 ')); synchronized (mLock) {mLock.notify();System.out.println('--ThreadTest 結束等待 --'); }} }); mThreadOne.start(); try {synchronized (mLock) { System.out.println('--ThreadTest 進入等待 --'); mLock.wait();} } catch (InterruptedException e) {e.printStackTrace(); }} } public static void main(String[] var0) {ThreadTest threadTest = new ThreadTest();threadTest.start(); }}

DEMO1 輸出:

--ThreadTest 進入等待--正在查詢數據庫 1查詢數據庫 1 結束,: 無數據--ThreadTest 結束等待--根據結果繼續做其他事情

注意:

使用 wait() 和 notify() 必須在獲得同步鎖后才能調用,若直接調用會報 java.lang.IllegalMonitorStateException 錯誤,因為狀態由同步鎖保護。

wait() 不同于 sleep() 的是 wait() 會釋放同步鎖。

因為 wait() 和 notify() 是基于同步鎖實現的,每個對象都有自己的同步鎖,所以 wait() 和 notify() 是 Object 的方法,而不是 Thread。

DEMO2,wait() 與 notifyAll():

public class Test { private static Object mLock = new Object(); static class MyThread extends Thread {String mName;Callback mCallback;public MyThread(String name){ mName = name;}@Overridepublic void run() { work(); if (mCallback != null) {mCallback.onResult(false); }}// 耗時 3sprivate void work() { System.out.println(mName + ' 等待 '); try {synchronized (mLock) { mLock.wait();} } catch (InterruptedException e) {e.printStackTrace(); }}public void setCallback(Callback callback) { mCallback = callback;}public interface Callback { void onResult(boolean result);} } static class ThreadTest extends Thread {@Overridepublic void run() { work('db1'); work('db2'); work('db3'); try {sleep(2000); } catch (InterruptedException e) {e.printStackTrace(); } synchronized (mLock) {System.out.println(' 喚醒全部 ');mLock.notifyAll(); }}private void work(String name) { final MyThread myThread = new MyThread(name); myThread.setCallback(new MyThread.Callback() {@Overridepublic void onResult(boolean result) { System.out.println(myThread.mName + ' 回來了 ');} }); myThread.start();} } public static void main(String[] var0) {ThreadTest threadTest = new ThreadTest();threadTest.start(); }}

DEMO2 輸出:

db1 等待db3 等待db2 等待喚醒全部db3 回來了db1 回來了db2 回來了

同一個對象的 wait() 方法可多次在不同的線程中調用,可讓不同的線程進入等待(阻塞),可以一個一個 notify(),也可以調用 notifyAll() 一次性全部喚醒。

來自:http://hackeris.me/2017/05/07/thread_base_1/

標簽: Java
相關文章:
主站蜘蛛池模板: 日韩一区二区不卡中文字幕 | 国产成人精品高清免费 | 亚洲精品国产经典一区二区 | 久久久久久亚洲精品中文字幕 | 久久99久久精品久久久久久 | 国产午夜精品不卡观看 | www色在线| 国产精品国产亚洲精品不卡 | 特级淫片国产免费高清视频 | 农村寡妇一级毛片免费看视频 | 韩日一级视频 | 欧美亚洲在线 | 农村寡妇野外情一级毛片 | 极品精品国产超清自在线观看 | 中文字幕在线一区二区在线 | 久久久精品成人免费看 | 亚洲天堂欧美 | 美女图片131亚洲午夜 | 99国产精品视频久久久久 | 国产成人精品无缓存在线播放 | 国产无卡一级毛片aaa | 男女福利| 成人www视频网站免费观看 | 亚洲一区二区三区在线 | 美女黄页黄频 | 欧美一级毛片一免费 | 免费高清欧美一区二区视频 | 成人免费午间影院在线观看 | 三级c欧美做人爱视频 | 欧美有码在线观看 | 免费国产视频在线观看 | 本道久久综合88全国最大色 | bt天堂国产亚洲欧美在线 | 亚洲视频免费在线 | 一区二区日韩欧美 | 亚洲高清一区二区三区久久 | 五月久久噜噜噜色影 | 特级欧美午夜aa毛片 | 成人在线第一页 | 亚洲精品国产免费 | 国产精品视频第一区二区三区 |