程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JavaSE——線程通訊

JavaSE——線程通訊

編輯:關於JAVA

JavaSE——線程通訊。本站提示廣大學習愛好者:(JavaSE——線程通訊)文章只能為提供參考,不一定能成為您想要的結果。以下是JavaSE——線程通訊正文


線程通訊:

  假如線程A和線程B持有同一個MyObject類的對象object,這兩個線程會去調用不同的辦法,但是它們是同步執行的,比方:線程B需求等候線程A執行完了methodA()辦法之後,它才干執行methodB()辦法。這樣,線程A和線程B就完成了 通訊。

線程通訊中要用到的辦法:wait()辦法:

  執行同步鎖(obj對象)的該辦法的線程進入梗塞形態,會釋放對象的鎖,java虛擬機把該線程放到該對象的等候池中,該線程假如要再次執行,則需求其他線程將它喚醒。

 

 1 package tongxin;
 2 
 3 public class MyThreadA extends Thread {
 4     private Object obj;
 5     public MyThreadA(String name,Object obj){
 6         
 7         super(name);
 8         this.obj = obj;
 9         
10     }
11     public void run(){
12         synchronized(obj){  //設置obj為同步鎖
13 
14             for(int i = 0;i<10;i++){
15                 System.out.println(Thread.currentThread().getName()+"---"+i);
16                 
17                 if(i == 5){
18                     try {
19                         obj.wait();
20                     } catch (InterruptedException e) {
21                         // TODO Auto-generated catch block
22                         e.printStackTrace();
23                     }
24                     try {
25                         sleep(100);
26                     } catch (InterruptedException e) {
27                         // TODO Auto-generated catch block
28                         e.printStackTrace();
29                     }
30                 }
31             }
32         }
33     }
34 
35 }

 

 1 package tongxin;
 2 
 3 public class Demo01 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         
 8         Object obj = new Object();
 9         MyThreadA mt1 = new MyThreadA("A",obj);
10         mt1.start();
11 
12     }
13 
14 }

 output:

1 A---0
2 A---1
3 A---2
4 A---3
5 A---4
6 A---5

當i = 5時,執行了同步鎖的wait()辦法,然後線程A將同步鎖釋放進入梗塞形態,假如A線程還有恢復運轉,則需求另一個持相反同步鎖的線程將其喚醒。

 

喚醒線程的辦法:notifi()

  另一個線程在運轉進程中執行了同步鎖的notifi辦法,  會喚醒在對象的等候池中等候的一個線程(隨機選擇),java虛擬時機隨機選擇一個線程轉到對象的鎖池中。

  留意一個線程要去喚醒另一個執行了wait()辦法進入梗塞形態的線程,則其要去執行同一個同步鎖的notifi()辦法。

  假設有一個房間,A出來之後把門鎖上,A在房間裡睡著了,B要把A叫醒,就要用鎖(同步鎖)上的鑰匙把門開開。A與B用的是同一把鎖,只不過A是在鎖門(wait()辦法),B是在開門(notifi()辦法)。

 1 package tongxin;
 2 
 3 public class MyThreadB extends Thread {
 4     private Object obj;
 5     public MyThreadB(String name,Object obj){
 6         
 7         super(name);
 8         this.obj = obj;
 9         
10     }
11     public void run(){
12         synchronized(obj){  //設置obj為同步鎖
13 
14             for(int i = 0;i<10;i++){
15                 System.out.println(Thread.currentThread().getName()+"---"+i);
16                 
17                 if(i == 2){
18                     obj.notify();
19                     try {
20                         sleep(100);
21                     } catch (InterruptedException e) {
22                         // TODO Auto-generated catch block
23                         e.printStackTrace();
24                     }
25                 }
26             }
27         }
28     }
29 
30 
31 }
 1 package tongxin;
 2 
 3 public class Demo01 {
 4 
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         
 8         Object obj = new Object();
 9         MyThreadA mt1 = new MyThreadA("A",obj);
10         MyThreadB mt2 = new MyThreadB("B",obj);
11         mt1.start();
12         mt2.start();
13         
14 
15     }
16 
17 }

 output:

A---0
A---1
A---2
A---3
A---4
A---5
B---0
B---1
B---2
B---3
B---4
B---5
B---6
B---7
B---8
B---9
A---6
A---7
A---8
A---9

創立一個新的線程對象B來喚醒A線程,運轉進程中,i = 2時,B喚醒A線程將其轉到對象的鎖池中,但此時由於B持有同步鎖所以B線程持續運轉,運轉完畢後釋放同步鎖,此時A獲取到同步鎖恢復運轉。

 

notifyAll()辦法:

該辦法會喚醒在這個對象鎖池中的一切線程。

 

如有不對之處還望指正,謝謝。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved