java 線程的休眠和喚醒


Treead中使用wair() 和notify()

/*需求:
       使用雙線程交替打印1,2,3,4.......
          
                 eg:
                      T11   ------->1
                      T22   ------->2
                      T11   ------->3
                      T22   ------->4
                      T11   ------->5
                      T22   ------->6
                      T11   ------->7
                      T22   ------->8
                         
                       ....................


*可以看出來這里的雙線程是同步的* */

 ps:我也是一個新手,有問題歡迎交流,780720038@qq.com

我直接貼代碼了 ,ceshi2.java

 1  
 2 public class ceshi2 {
 3 
 4     public static void main(String[] args) {
 5         // TODO Auto-generated method stub
 6         Number number =new Number();
 7         Thread t11 =new Thread(new T11(number));  //生成線程
 8         Thread t22 =new Thread(new T22(number));
 9         t11.setName("t11");  //設置線程名
10         t22.setName("t22");
11         t11.start();   //啟動線程
12         t22.start();
13 
14     }
15 
16 }
17 
18 class Number{
19     public int num=1; //number.num的起始值為1
20 }
21 
22 class T11 implements Runnable{
23     private Number number;
24     T11(Number number){    //通過構造函數引入 Number對象
25         this.number=number;
26     }
27     public void run(){
28         while(number.num<30){ // 條件  number.num <30   
29             synchronized(number){//通過同步語句塊將異步線程變成同步線程執行以下語句,對象為number  
30                 try{
31                     if(number.num %2!=0){ //打印非2的倍數
32                         Thread.sleep(500);//0.5s打印一次
33                         System.out.println(Thread.currentThread().getName()+"------>"+number.num); //獲取當前線程名
34                         number.num++; //打印后num 自增
35                     }
36                     if(number.num %2==0){
37                         number.notify(); //喚醒 休眠狀態下的線程T22
38                         number.wait();    //線程T11釋放對象鎖,讓線程T22獲取到對象鎖,而線程T11進入休眠狀態
39                     }
40                 }catch(Exception e){
41                     e.printStackTrace(); //詳細的異常情況
42                 }
43             }
44         }
45     }
46 }
47 
48 class T22 implements Runnable{
49     private Number number;
50     T22(Number number){
51         this.number=number;
52     }
53     public void run(){
54         while(number.num<30){
55             synchronized(number){
56                 try{
57                     if(number.num %2==0){  //打印2的倍數
58                         Thread.sleep(500);
59                         System.out.println(Thread.currentThread().getName()+"------>"+number.num);
60                         number.num++;
61                     }
62                     if(number.num %2!=0){
63                         number.notify();
64                         number.wait();
65                             
66                     }
67                 }catch(Exception e){
68                     e.printStackTrace();
69                 }
70             }
71         }
72     }
73 }
ceshi2.java

 

執行結果如下:

執行結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM