package com.yswdqs.list;
class NumberPrint implements Runnable{
private int number;
public Object res;
public static int count = 5;
public NumberPrint(int number,Object a){
this.number = number;
res = a;
}
@Override
public void run(){
synchronized (res){
while(count-- > 0){
try {
res.notify();//唤醒等待res资源的线程,把锁交给线程(该同步锁执行完毕自动释放锁)
System.out.println(" "+number);
res.wait();//释放CPU控制权,释放res的锁,本线程阻塞,等待被唤醒。
System.out.println("------线程"+
Thread.currentThread().getName()+"获得锁,"+
"wait()后的代码继续运行:"+number);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class test {
public static void main(String args[]){
Object a = new Object();//以该对象为共享资源
new Thread(new NumberPrint((1),a),"1").start();
new Thread(new NumberPrint((2),a),"2").start();
}
}
输出:
1 --------------线程1输入1后执行wait睡觉去了
2 --------------线程2将线程1唤醒了,线程2睡了
------线程1获得锁,wait()后的代码继续运行:1
1 ----------在while循环里面第一次循环
------线程2获得锁,wait()后的代码继续运行:2 -----线程1将线程2唤醒了,线程1睡了
2
------线程1获得锁,wait()后的代码继续运行:1
1
------线程2获得锁,wait()后的代码继续运行:2
---------while中的count-- 等于0 跳出循环
wait与notify使用案例--必须是同一个对象
于 2022-07-12 15:18:20 首次发布
本文展示了如何在Java中使用`synchronized`关键字,`wait()`和`notify()`方法实现线程间的同步与通信。通过创建`NumberPrint`类并实例化两个线程,线程间共享资源并交替打印数字,直至计数器`count`减为0。线程在执行完特定操作后调用`wait()`进入等待状态,由其他线程唤醒继续执行。
摘要由CSDN通过智能技术生成