wait() notify使用注意事项
来源:互联网 发布:制作app软件下载 编辑:程序博客网 时间:2024/06/04 20:12
1.wait被调用之前notify的唤醒通知就来了,那么这个线程并不能保证被唤醒,有可能会导致死锁问题
2.不要使用if(队列size>最大个数) 否则真的会出现放入队列的size个数超过最大值的情况,推荐使用while
3.不要使用notify,推荐使用notifyall()
下面是生产者和消费者线程死锁方式和正确方式
package thred;import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSONObject;/** * 线程间通信 * 执行结果* @Description: TODO(用一句话描述该文件做什么) * @author min.zhang-2 * @date 2017年12月19日 上午9:39:53 * @version V1.0 */public class TestWaitNotify {public static void main(String[] args) {/*对应下面的注释1的类,如果生产者先过来,生产者想唤醒消费者,没有线程被阻塞唤醒结束消费者还没有被阻塞,这时候他请求过来,消费者线程被阻塞!!!!!执行结果:消费者等待吃苹果*//*String nameString = "test";Coustem Coustem = new Coustem(nameString);Producer Producer = new Producer(nameString);Coustem.start();Producer.start();*//*** * 实现了线程间通信的生产者和消费者,运行结果 * * 使用notifyall()的时候 * 生产者生产了2个2["3","3"]消费者消费掉了一个1["3"]消费者消费掉了一个0[]消费者开始等待生产者生产了2个2["3","3"]消费者消费掉了一个1["3"]消费者消费掉了一个0[]消费者开始等待使用notify的时候,总是等待生产者满了等待之后才唤醒消费者,为啥呢?,所以推荐使用notifyall()生产者生产了2个2["3","3"]生产者生产了2个4["3","3","3","3"]生产者生产了2个6["3","3","3","3","3","3"]生产者生产了2个8["3","3","3","3","3","3","3","3"]生产者生产了2个10["3","3","3","3","3","3","3","3","3","3"]生产仓库已经满了10开始等待消费者消费掉了一个9["3","3","3","3","3","3","3","3","3"] */List<String> obList = new ArrayList<String>();Coustem Coustem = new Coustem(obList);Producer Producer = new Producer(obList);Producer.start();Coustem.start();}}/*****************这种方式就是死循环了*************//*class Coustem extends Thread{private Object lock;public Coustem(Object lock){this.lock=lock;}@Overridepublic void run() {synchronized(lock) {try {System.out.println("消费者等待吃苹果");lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("消费者部分结束");}}}class Producer extends Thread{private Object lock;public Producer(Object lock){this.lock=lock;}@Overridepublic void run() {synchronized(lock) {System.out.println("生产者生产了一个苹果");lock.notify();System.out.println("生产者部分结束");}}}*//*********************************对应main的第二段 ,实现了生产者消费者**********/class Producer extends Thread{private List<String> lock;public Producer(List<String> lock){this.lock=lock;}@Overridepublic void run() {while(true){synchronized(lock){while(lock.size() >= 10) {System.out.println("生产仓库已经满了"+lock.size()+"开始等待");try {lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}lock.add("3");lock.add("3");System.out.println("生产者生产了2个"+lock.size()+JSONObject.toJSONString(lock));lock.notify();}}}}class Coustem extends Thread{private List<String> lock;public Coustem(List<String> lock){this.lock=lock;}@Overridepublic void run() {while(true){synchronized (lock) {while(lock.size() == 0) {System.out.println("消费者开始等待");try {lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}lock.remove("3");System.out.println("消费者消费掉了一个"+lock.size()+JSONObject.toJSONString(lock));lock.notify();}}}}
阅读全文
0 0
- wait() notify使用注意事项
- 多线程编程入门(4):wait,notify方法使用注意事项
- java 多线程notify wait 注意事项
- wait()/notify()的使用
- wait和notify使用
- java wait,notify使用
- java notify wait 使用
- wait, notify, notifyAll的使用
- wait和notify的使用
- wait和notify的使用
- java:简单使用wait,notify
- JAVA wait(), notify(),sleep使用
- wait() notify() notifyAll() 使用范例
- wait 和notify的使用
- wait, notify 和 notifyAll 使用
- wait & notify
- wait()/notify()
- Wait/Notify
- 课程设计 成绩管理系统
- VS运行闪退?
- WPF的Treeview控件实现CheckBox
- Window10内置Ubuntu系统 搭建TensorFlow 平台搭建
- 【android】绘制圆环的三种方式
- wait() notify使用注意事项
- VS2013 error LNK1104: cannot open file " .lib"
- Elasticsearch架构
- 分布式消息队列RabbitMQ之三:四种典型使用场景和代码示例
- 文件属性获取
- Bean 的生命周期
- Android Studio使用时出现的问题
- 二叉查找树的构建及遍历
- 服务端I/O性能大比拼:Node、PHP、Java、Go