线程的同步 wait和notify
2015-11-30 21:35
671 查看
线程的同步 wait和notify
调用sleep()的时候,锁并没有被释放,yield也是这种情况;而调用wait()方法,线程的执行将被挂起,对象上的锁将被释放。这也就以为着,当你调用了wait()的时候,另一个任务可以取得锁,其他的synchronized方法可以在wait()期间被调用。当你调用wait() 的时候,就是在声明:“我已经做完能做的所有的事情,因此我要在这里等待,但是我希望其他的synchronized操作可以在条件合适的情况下调用”!
模拟汽车打蜡抛光
Car.javapackage com.company; /** * Created by QT on 2015/11/30. */ public class Car { private boolean isWaxed=false; /** * 已经打蜡 */ public synchronized void waxed(){ isWaxed=true; notifyAll(); } /** * 已经抛光 */ public synchronized void buffed(){ isWaxed=false; notifyAll(); } /** * 等待打蜡 */ public synchronized void waitForWaxxing(){ //只要已经抛完光,就一直保持等待 while(isWaxed==false){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 等待抛光 */ public synchronized void waitForBuffered(){ //只要已经打过蜡,就一直保持等待 while(isWaxed==true){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
wax.java 打蜡线程
package com.company; /** * 打蜡 * Created by QT on 2015/11/30. */ public class wax implements Runnable { private Car car; public wax(Car car) { this.car=car; } @Override public void run() { try { //只要线程没有中断,就一直执行 while (!Thread.interrupted()) { System.out.println("打蜡"); Thread.sleep(200); //已经打蜡了 car.waxed(); //准备抛光 car.waitForBuffered(); } }catch(Exception ex){ ex.printStackTrace(); } } }
buffer.java 抛光线程
package com.company; import java.util.concurrent.TimeUnit; /** * Created by QT on 2015/11/30. */ public class buffer implements Runnable { private Car car; public buffer(Car car) { this.car=car; } @Override public void run() { try { //只要线程没有中断,就一直执行 while (!Thread.interrupted()) { //首先要等待抛光完成 car.waitForWaxxing(); TimeUnit.MILLISECONDS.sleep(200); System.out.println("抛光"); car.buffed(); } }catch(Exception ex){ ex.printStackTrace(); } } }
main.java 测试代码
package com.company; public class Main { public static void main(String[] args) { Car car = new Car(); Thread t1 = new Thread(new wax(car)); Thread t2 = new Thread(new buffer(car)); t1.start(); t2.start(); } }
运行结果
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#通过Semaphore类控制线程队列的方法
- C#多线程处理多个队列数据的方法
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- 再谈JavaScript线程
- C#实现终止正在执行的线程
- Java线程编程中的主线程讲解
- 解析Java线程同步锁的选择方法