国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java多線程基礎 線程的等待與喚醒(wait、notify、notifyAll)

Java多線程基礎 線程的等待與喚醒(wait、notify、notifyAll)

2020-10-23 20:53hackeris Java教程

這篇文章主要介紹了Java多線程基礎 線程的等待與喚醒,需要的朋友可以參考下

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class Test {
 
 static class ThreadOne extends Thread {
 
  private Callback mCallback;
 
  @Override
  public void run() {
   work();
   if (mCallback != null) {
    mCallback.onResult(false);
   }
  }
 
  // 耗時 3s
  private 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;
 
  @Override
  public void run() {
   workOne();
   System.out.println(" 根據結果繼續做其他事情 ");
  }
 
  private void workOne() {
   mThreadOne = new ThreadOne();
   mThreadOne.setCallback(new ThreadOne.Callback() {
    @Override
    public 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 輸出:

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

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

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

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

DEMO2,wait() 與 notifyAll():

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class Test {
 
 private static Object mLock = new Object();
 
 static class MyThread extends Thread {
 
  String mName;
  Callback mCallback;
 
  public MyThread(String name){
   mName = name;
  }
 
  @Override
  public void run() {
   work();
   if (mCallback != null) {
    mCallback.onResult(false);
   }
  }
 
  // 耗時 3s
  private 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 {
 
 
 
  @Override
  public 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() {
    @Override
    public 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/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩欧美国产一区二区三区 | 精品日韩一区二区 | 国产成人a亚洲精品 | 精品国产乱码久久久久久88av | 亚洲男人的天堂网站 | 国产黄色一级片视频 | 黄色精品一区二区 | 日韩一区二区三区在线看 | 欧美日韩高清不卡 | 日韩爱爱网址 | 黄色在线免费观看 | 欧美成人区 | 欧美视频在线播放 | 大片免费播放在线观看视频 | 91精品久久久久久久久久入口 | 亚洲精品中文字幕在线观看 | 中文字幕久久久 | 精品久久久久久久久久久下田 | 国产一区二区在线看 | 国产免费自拍 | 国产精品影视在线观看 | 毛片免费在线播放 | 亚洲精品永久免费 | 欧美日韩精品一区二区三区蜜桃 | 欧美福利网址 | 91麻豆精品国产91久久久更新资源速度超快 | 午夜影院网站 | 天天射天天干 | 高清国产一区二区三区四区五区 | 一区二区免费在线观看 | 99视频这里有精品 | 欧美日韩久久精品 | 97视频免费在线观看 | 欧美 亚洲 另类 激情 另类 | 视频一区 国产精品 | 青草青草久热精品视频在线观看 | 欧美亚洲综合久久 | 国产精品永久免费自在线观看 | 亚洲精品国产片 | 综合精品久久久 | 欧美精品在线看 |