Java 线程通信 例子:使用俩个线程打印1-100.线程1 线程2 交替打印

 1 package bytezero.threadcommunication;
 2 
 3 /**
 4  * 线程通信的例子:使用俩个线程打印1-100.线程1 线程2  交替打印
 5  *
 6  * 涉及到的三个方法:
 7  * wait();  一旦执行此方法,当前线程就进入了阻塞状态,并释放同步监视器
 8  * notify();  一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就
 9  * 唤醒优先级高的线程
10  * notifyAll();  一旦执行此方法,就会唤醒被wait的所有线程
11  *
12  *说明:
13  * 1.wait();notify(); notifyAll(); 这三个方法必须使用在同步代码块或同步方法中。
14  * 2.wait();notify(); notifyAll();这三个方法调用者必须是同步代码块或同步方法的
15  * 同步监视器,否则会出现 IllegalMonitorStateException异常
16  *3.wait();notify(); notifyAll();这三个方法定义在 java.lang.Object类中。
17  *
18  * 面试题:slepp()  和 wait()的异同?
19  * 1.相同点:一旦执行方法,都可以使得当前线程进入阻塞状态
20  * 2.不同点:1)两个方法声明的位置不同:Thread类中声明sleep(),Object类声明wait()
21  *          2)调用的要求不同:sleep(); 可以在任何需要的场景下调用
22  *                           wait()必须使用在同步代码块或同步方法中
23  *          3)关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,
24  *          sleep() 不会释放 同步监视器,wait()会释放同步监视器
25  * @author Bytezero1·zhenglei!    Email:420498246@qq.com
26  * create  2021-10-18 15:29
27  */
28 
29 class Number implements Runnable{
30     private int number = 1;
31     private Object obj = new Object();
32 
33     @Override
34     public void run() {
35         while (true){
36             synchronized (this) {
37                 this.notify();
38 
39                 if(number <= 100){
40                     try {
41                         Thread.sleep(100);
42                     } catch (InterruptedException e) {
43                         e.printStackTrace();
44                     }
45 
46                     System.out.println(Thread.currentThread().getName()+":"+number);
47                     number++;
48 
49                     try {
50                         //使得调用如下 wait()方法的线程进入阻塞状态
51                         wait();
52                     } catch (InterruptedException e) {
53                         e.printStackTrace();
54                     }
55 
56                 }else{
57                     break;
58                 }
59             }
60         }
61 
62     }
63 }
64 public class CommunicationTest {
65     public static void main(String[] args) {
66         Number number = new Number();
67         Thread t1 = new Thread(number);
68         Thread t2 = new Thread(number);
69 
70         t1.setName("线程1");
71         t2.setName("线程1");
72 
73         t1.start();
74         t2.start();
75     }
76 }

 

posted on 2021-10-18 16:07  Bytezero!  阅读(365)  评论(0编辑  收藏  举报