java中多线程中测试某个条件的变化用 if 还是用 while?
2017-04-29 15:13
281 查看
最近在研究wait和notify方法,发现有个地方要注意,但是网上又说得不是很明白的地方,就是经典的生产者和消费模式,使用wait和notify实现,判断list是否为空的这个为什么要用while而不能使用if呢?其实是因为当线程wait之后,又被唤醒的时候,是从wait后面开始执行,而不是又从头开始执行的,所以如果用if的话,被唤醒之后就不会在判断if中的条件,而是继续往下执行了,如果list只是添加了一个数据,而存在两个消费者被唤醒的话,就会出现溢出的问题了,因为不会在判断size是否==0就直接执行remove了。但是如果使用while的话,从wait下面继续执行,还会返回执行while的条件判断,size>0了才会执行remove操作,所以这个必须使用while,而不能使用if来作为判断。
以下代码是一个简单的实践,参考:http://www.cnblogs.com/hapjin/p/5492645.html(做了适当的调整)
Add类,负责添加数据:
Subtract类,负责删除数据
封装的List队列:
测试类:
来自为知笔记(Wiz)
以下代码是一个简单的实践,参考:http://www.cnblogs.com/hapjin/p/5492645.html(做了适当的调整)
Add类,负责添加数据:
public class Add { private String lock; public Add(String lock) { super(); this.lock = lock; } public void add() { synchronized (lock) { ValueObject.list.add("anyString"); lock.notifyAll(); } } } public class ThreadAdd extends Thread { private Add p; public ThreadAdd(Add p) { super(); this.p = p; } @Override public void run() { p.add(); } }
Subtract类,负责删除数据
public class Subtract { private String lock; public Subtract(String lock) { super(); this.lock = lock; } public boolean check() { System.out.println("check"); return true; } public void subtract() { try { synchronized (lock) { if(check() && ValueObject.list.size() == 0) {//将这里的if改成while即可保证不出现越界异常!!!! System.out.println("wait begin ThreadName=" + Thread.currentThread().getName()); lock.wait(); System.out.println("wait end ThreadName=" + Thread.currentThread().getName()); } ValueObject.list.remove(0); System.out.println("list size=" + ValueObject.list.size()); } } catch (InterruptedException e) { e.printStackTrace(); } } } public class ThreadSubtract extends Thread { private Subtract r; public ThreadSubtract(Subtract r) { super(); this.r = r; } @Override public void run() { r.subtract(); } }
封装的List队列:
public class ValueObject { public static List list = new ArrayList(); }
测试类:
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); ThreadSubtract subtract1Thread = new ThreadSubtract(subtract); subtract1Thread.setName("subtract1Thread"); subtract1Thread.start(); ThreadSubtract subtract2Thread = new ThreadSubtract(subtract); subtract2Thread.setName("subtract2Thread"); subtract2Thread.start(); Thread.sleep(1000); ThreadAdd addThread = new ThreadAdd(add); addThread.setName("addThread"); addThread.start(); } }
来自为知笔记(Wiz)
相关文章推荐
- java中多线程中测试某个条件的变化用 if 还是用 while?
- java多线程为什么要用while而不是if
- java生产者消费者PV操作为中,wait判断条件为何是while不是if疑惑解答
- 多线程wait 和 notify的判断条件(if 和 while)和假死
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。Java实现
- 多线程为何用while判断条件,而不用if。
- java题目:求 1+2+...+n,要求不能用除法、 for、 while、 if、 else、 switch、 case 等关键字及条件判断语句( A?B:C)。
- 剑指Offer(Java版): 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- java中if判断条件语句测试代码总结
- Java 多线程测试示例代码 (论坛回复摘要)
- Java多线程开发之~~~多条件Condition接口的使用
- 不使用乘除法,for,while,if,else,switch,case,条件判断语句(A?B:C) 实现:1+2+....+n
- Interview----求 1+2+...+n, 不能用乘除法、for、while if、else、switch、case 等关键字以及条件判断语句 (A?B:C)
- Java多线程系列--“JUC锁”06之 Condition条件
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载
- java,web应用中,关于多用户访问,是不是就是一个用户等于一个线程? 50 那一般的时候是多用户多线程还是多用户单线程。 6S根本停不下来 | 浏览 2065 次 我有更好的答案 发布于2016-
- java基础之 “if ”条件分支语句和switch开关语句
- Java多线程--竞争条件
- Python基础(条件判断和循环) if elif else for while break continue;
- 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)