3.1.10等待wait的条件变化
来源:互联网 发布:快三数据接口 编辑:程序博客网 时间:2024/06/05 05:08
package demo;import java.util.ArrayList;import java.util.List;/** * Created by sunyifeng on 17/10/16. */public class ValueObject { public static List list = new ArrayList();}
package demo;/** * Created by sunyifeng on 17/10/16. */public class Add { private String lock; public Add(String lock) { super(); this.lock = lock; } public void add() { synchronized (lock) { ValueObject.list.add("sunyf"); lock.notifyAll(); } }}
package demo;import com.sun.tools.internal.ws.wsdl.document.soap.SOAPUse;/** * Created by sunyifeng on 17/10/16. */public class Subtract { private String lock; public Subtract(String lock) { super(); this.lock = lock; } public void substract() { try { synchronized (lock) { while (ValueObject.list.size() == 0) { System.out.println("等待开始,线程名称:" + Thread.currentThread().getName()); lock.wait(); System.out.println("等待结束,线程名称:" + Thread.currentThread().getName()); } ValueObject.list.remove(0); System.out.println("list的大小:" + ValueObject.list.size()); } } catch (InterruptedException e) { e.printStackTrace(); } }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadAdd extends Thread { private Add a; public ThreadAdd(Add a) { super(); this.a = a; } @Override public void run(){ a.add(); }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class ThreadSubtract extends Thread { private Subtract s; public ThreadSubtract(Subtract s) { super(); this.s = s; } @Override public void run(){ s.substract(); }}
package demo;/** * Created by sunyifeng on 17/10/16. */public class Run { public static void main(String[] args) throws InterruptedException { String lock = new String(""); // 加 Add add = new Add(lock); // 减 Subtract subtract = new Subtract(lock); // 减线程1 ThreadSubtract threadSubtract1 = new ThreadSubtract(subtract); threadSubtract1.setName("threadSubtract1"); threadSubtract1.start(); // 减线程2 ThreadSubtract threadSubtract2 = new ThreadSubtract(subtract); threadSubtract2.setName("threadSubtract2"); threadSubtract2.start(); // 沉睡 Thread.sleep(1000); // 加线程(唤醒) ThreadAdd threadAdd = new ThreadAdd(add); threadAdd.setName("threadAdd"); threadAdd.start(); }}
运行结果:等待开始,线程名称:threadSubtract1
等待开始,线程名称:threadSubtract2
等待结束,线程名称:threadSubtract2
list的大小:0
等待结束,线程名称:threadSubtract1
等待开始,线程名称:threadSubtract1
程序分析:
注意while语句,线程1执行remove,移除一个元素,线程2执行的时候while(true)变成死循环,不在往下执行。while改成if线程2会往下执行到remove(0)的时候报异常,因为list的大小为1,不能remove两次。
阅读全文
0 0
- 3.1.10等待wait的条件变化
- c++11conditon_variable的wait在类中的等待条件
- 3.4wait的条件发生变化导致逻辑错误
- 等待函数(wait function)的一点释疑
- 理解线程的等待释放(wait/notify)
- 进程的等待(wait和waitpid)
- 进程的等待wait() --多进程编程
- 3.1等待/通知机制(wait/notify)
- 等待队列wait queue
- 等待事件 wait event
- C# 等待Wait
- 线程等待join(),wait()
- 进程等待wait,waitpid
- Wait Queue等待队列
- android 的 线程的睡眠,等待,wait,notify
- Ext等待动画Ext.MessageBox.wait的使用
- linux下的进程等待(wait和waitpid)
- 关于wait(),waitpid()等待子进程的理解
- 用C++实现选择排序
- 【CC2640R2F】香瓜CC2640R2F之自定义周期事件
- Mysql登录不要密码,怎么设定密码.
- Blender 如何创建一个中空圆柱(圆筒、空心柱)
- 使用JSR-303验证框架
- 3.1.10等待wait的条件变化
- leetcode练习 Add Two Numbers
- ROS-Kinect 自带opencv与自定义的opencv版本兼容问题
- Git 笔记
- tensorflow queue operation
- 3.1.11生产者消费者模式(1:1)
- ipv6地址分类
- 【Unity3d】在Unity3d中播放视频:AVPro Video的使用
- spring cloud 之Spring Cloud Config 尝鲜