两个线程交替运行——使用synchronized+wait+notify实现
2024-09-16 09:36:58
public class ExecuteThread {
private static Object obj = new Object();
private static boolean flag; // 默认是false public static void main(String[] args) {
new Thread(new Runnable() { // 匿名内部类
@Override
public void run() {
synchronized (obj) {
for (int i = 0; i < 10; i++) {
if (flag) {
try {
obj.wait(); // 释放锁进入等待队列(等待池),线程2获取到对象锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.notify(); // 唤醒等待队列中线程2进入锁池竞争对象锁
flag = true;
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
}, "thread1").start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
for (int i = 0; i < 10; i++) {
if (!flag) {
try {
obj.wait(); // 释放锁进入等待队列(等待池),线程1获取到对象锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
obj.notify(); // 唤醒等待队列中线程1进入锁池竞争对象锁
flag = false;
System.out.println(Thread.currentThread().getName() + "--->" + i);
}
}
}
}, "thread2").start();
}
}
最新文章
- 用js实现动画效果核心方式
- mysql分区操作
- JQM页面跳转,多种效果
- 打印log
- document.body.scrollTop 各浏览器兼容性解决
- 苹果审核Metadata Rejected
- Discuss!X3.2 绑定微信
- Android软件开发之常用系统控件界面整理
- 加载SpriteBuilder中的scene为何不能带后缀
- (一)linux定时任务的设置 crontab 基础实践
- 使用Wscript/cscript调用VB脚本
- Mac下GitHub以及GitHub Desktop使用实战
- 《转载》为什么我要在2018年学习Python?
- ToString yyyy-MM-dd ,MM 小写的故事。
- ExtJs TreePanel 全选与反选
- Windows Server、 Windows 区别
- BGP&;RIP
- C# WPF DataGrid 隔行变色及内容居中对齐
- SQL SERVER 2012 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 (System.Data)
- 一、基于Qt的图像矩形区域改色