java 线程的休眠和唤醒

Posted 搬砖学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:我也是一个新手,有问题欢迎交流,[email protected]

我直接贴代码了 ,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

 

执行结果如下:

技术分享执行结果

 




以上是关于java 线程的休眠和唤醒的主要内容,如果未能解决你的问题,请参考以下文章

Android线程管理——Thread类的内部原理休眠及唤醒

有没有办法唤醒睡眠线程?

Android 实现休眠和唤醒

java并发-线程池总结

Java学习之多线程二

初学线程休眠和礼让