等待和通知 Object对象提供了wait( ) 方法和 notify ( ) 方法。
wait( )方法需要配对着synchronized 关键字使用。
当一个线程的资源调用 wait( )方法时,它会失去锁,然后进入等待序列。
当其他线程调用notify方法时才会重新激活。
实例:
package com.xm.thread.t_19_01_27;
import java.util.concurrent.TimeUnit;
public class NotifyAndWait{private static Object object = new Object();
static class WaitThread extends Thread{@Override
public void run() {
System.out.println("WaitThread Start!");
try {
System.out.println("Object wait!!!");
synchronized (object) {
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("WaitThread Finish!");
}
}static class NotifyThread extends Thread{@Override
public void run() {
System.out.println("NotifyThread Start!");
System.out.println("Object notify");
synchronized (object) {
object.notify();
}
System.out.println("NotifyThread Finish!");
}
}public static void main(String[] args) throws InterruptedException {
new WaitThread().start();
TimeUnit.SECONDS.sleep(5);
new NotifyThread().start();
}
}
运行结果:
WaitThread Start!notify( )方法只会随机激活等待序列中的一个线程,而notifyAll( )方法激活所有等待的线程。
Object wait!!!
NotifyThread Start!
Object notify
NotifyThread Finish!
WaitThread Finish!
实例:
package com.xm.thread.t_19_01_27;
import java.util.concurrent.TimeUnit;
public class NotifyAndWait{private static Object object = new Object();
static class WaitThread extends Thread{@Override
public void run() {
System.out.println("WaitThread Start!");
try {
System.out.println("Object wait!!!");
synchronized (object) {
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("WaitThread Finish!");
}
}static class NotifyThread extends Thread{@Override
public void run() {
System.out.println("NotifyThread Start!");
System.out.println("Object notify");
synchronized (object) {
object.notify();
}
System.out.println("NotifyThread Finish!");
}
}public static void main(String[] args) throws InterruptedException {
new WaitThread().start();
new WaitThread().start();
TimeUnit.SECONDS.sleep(5);
new NotifyThread().start();
}
}
运行结果:
WaitThread Start!结果分析: 两个WaitThread线程只被唤醒了一个。
Object wait!!!
WaitThread Start!
Object wait!!!
NotifyThread Start!
Object notify
NotifyThread Finish!
WaitThread Finish!
实例:
package com.xm.thread.t_19_01_27;
import java.util.concurrent.TimeUnit;
public class NotifyAndWait{private static Object object = new Object();
static class WaitThread extends Thread{@Override
public void run() {
System.out.println("WaitThread Start!");
try {
System.out.println("Object wait!!!");
synchronized (object) {
object.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("WaitThread Finish!");
}
}static class NotifyThread extends Thread{@Override
public void run() {
System.out.println("NotifyThread Start!");
System.out.println("Object notify");
synchronized (object) {
object.notifyAll();
}
System.out.println("NotifyThread Finish!");
}
}public static void main(String[] args) throws InterruptedException {
new WaitThread().start();
new WaitThread().start();
TimeUnit.SECONDS.sleep(5);
new NotifyThread().start();
}
}
运行结果:
WaitThread Start!结果分析: notifyAll( )方法会唤醒处在等待序列中的所有线程。
Object wait!!!
WaitThread Start!
Object wait!!!
【4.等待和通知】NotifyThread Start!
Object notify
NotifyThread Finish!
WaitThread Finish!
WaitThread Finish!
转载于:https://www.cnblogs.com/TimerHotel/p/thread04.html
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)