随笔 - 322  文章 - 0  评论 - 4  阅读 - 77146

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   Bytezero!  阅读(372)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示