zoukankan      html  css  js  c++  java
  • 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

    执行结果如下:

    执行结果
  • 相关阅读:
    EffectiveC++ 第6章 继承与面向对象设计
    关于并查集的路径压缩(Path Compress)优化
    EffectiveC++ 第5章 实现
    linux 中ls命令文件夹颜色修改
    linux中发出“滴”的怪声的解决方案
    java 常量池技术
    linux与window文件路径问题
    struts上传文件大小超过配置值的问题
    MDC介绍 -- 一种多线程下日志管理实践方式
    java单例模式的二种正确实现
  • 原文地址:https://www.cnblogs.com/yin-tao/p/7520773.html
Copyright © 2011-2022 走看看