日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java线程:线程交互

發布時間:2023/12/31 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java线程:线程交互 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基礎知識

  java.lang.Object的類的三個方法:

    void notify():喚醒在此對象監視器上等待的單個線程。

    void notifyAll():喚醒在此對象監視器上等待的所有線程。

    void wait():導致當前線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法。

    void wait(long timeout):導致當前線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法,或者是超過指定時間。

    void wait(long timeout,int nanos):導致當前線程等待,直到其他線程調用此對象的notify()方法或notifyAll()方法,或者是其他某個線程中斷當前線程,或超過某個實際時間。

以上方法使用要點:

  必須從同步環境中調用這些方法。線程不能調用對象上等待或通知的方法,除非它擁有那個對象的鎖。

  以上幾種方法都是Object的實例方法,與每個對象具有鎖是一樣的,每個對象可以有一個線程列表,它們等待來自該信號。線程通過wait()獲得這個等待列表。它不再執行任何其他指令,直到調用notify()為止。如果多個線程在同一個對象上等待,則將只選擇一個線程繼續執行。如果沒有線程等待,則不采取操作。如;

  

1 package Thread; 2 3 public class Test2 { 4 public static void main(String[] args){ 5 ThreadB b=new ThreadB(); 6 b.start();//線程A擁有b對象上的鎖。線程為了調用wait()或notify()方法,該線程必須是那個對象鎖的擁有者 7 synchronized(b){ 8 try{ 9 System.out.println("等待對象b完成計算...>"); 10 b.wait();//當前線程A等待 11 }catch(InterruptedException e){ 12 e.printStackTrace(); 13 } 14 System.out.println("b對象計算完畢,其總和是:"+b.total); 15 } 16 } 17 } 18 class ThreadB extends Thread{ 19 int total; 20 public void run(){ 21 synchronized(this){ 22 for(int i=0;i<101;i++){ 23 total+=i; 24 } 25 notify();//(完成計算)喚醒在此對象監視器上等待的單個線程,在本例中A被喚醒。 26 } 27 } 28 } 1 等待對象b完成計算...> 2 b對象計算完畢,其總和是:5050

  在對象上調用wait()方法時,執行該代碼的線程立刻放棄它在該對象的鎖,然后調用調用notify()方法,如果線程仍然在完成同步代碼,則線程移出之前不會放棄鎖。因此,只要調用notify()并不意味著這時的鎖變得可用。

二、多個線程在等待一個對象鎖時使用notifyAll()

  多數情況下,最好通知等待某個對象的所有線程。如果這樣做,可以在對象上使用notifyAll()方法,讓所有等待的線程返回到可運行狀態。如:

1 package Thread; 2 3 public class Test2 extends Thread{ 4 public static void main(String[] args){ 5 Calculator calculator=new Calculator(); 6 new Test2(calculator).start(); 7 new Test2(calculator).start(); 8 new Test2(calculator).start(); 9 calculator.start();//線程A擁有b對象上的鎖。線程為了調用wait()或notify()方法,該線程必須是那個對象鎖的擁有者 10 } 11 Calculator calculator; 12 public Test2(Calculator calculator){ 13 this.calculator=calculator; 14 } 15 public void run(){ 16 synchronized(calculator){ 17 try{ 18 System.out.println(Thread.currentThread()+"等待計算結果...>"); 19 calculator.wait();//當前線程A等待 20 }catch(InterruptedException e){ 21 e.printStackTrace(); 22 } 23 System.out.println(Thread.currentThread()+"結果為:"+calculator.total); 24 } 25 } 26 } 27 class Calculator extends Thread{ 28 int total; 29 public void run(){ 30 synchronized(this){ 31 for(int i=0;i<101;i++){ 32 total+=i; 33 } 34 notifyAll();//(完成計算)喚醒在此對象監視器上等待的單個線程,在本例中A被喚醒。 35 } 36 } 37 } View Code 1 Thread[Thread-1,5,main]等待計算結果...> 2 Thread[Thread-3,5,main]等待計算結果...> 3 Thread[Thread-2,5,main]等待計算結果...> 4 Thread[Thread-2,5,main]結果為:5050 5 Thread[Thread-3,5,main]結果為:5050 6 Thread[Thread-1,5,main]結果為:5050 View Code

?

當神已無能為力,那便是魔渡眾生

總結

以上是生活随笔為你收集整理的Java线程:线程交互的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。