关于多线程中使用while做循环而不使用if的解释

编程技术  /  houtizong 发布于 3年前   90
package com.thread.example;import java.util.LinkedList;public class Example10 {private LinkedList<Object> myList = new LinkedList<Object>();private int MAX = 10;public Example10() {super();}public void start(){new Producerder().start();new Consumereder().start();}class Producerder extends Thread {@Overridepublic void run() {for (int i = 0; i < 15; i++) {try {this.sleep(1000);} catch (Exception e) {e.printStackTrace();}synchronized (myList) {try {while(myList.size() == MAX){System.out.println("warning: it's full!");myList.wait();}//*************把这一段注释掉********************Object o = new Object();if(myList.add(o)){System.out.println("Producer: " + o);myList.notify();}//*******************************//把上面注释掉后,启用下面一行后。你再在Consumereder中分别是用while和if看下输出结果//myList.notify();} catch (Exception e) {System.out.println("producer is interrupted!");}}}}}class Consumereder extends Thread {@Overridepublic void run() {for (int i = 0; i < 15; i++) {try {this.sleep(100);} catch (Exception e) {e.printStackTrace();}synchronized (myList) {try {while(myList.size() == 0){System.out.println("warning: it's empty!");myList.wait();}System.out.println("oooooooooooooooooo");Object o = myList.removeLast();System.out.println("Consumereder" + o);myList.notify();} catch (Exception e) {   System.out.println("consumer is interrupted!");}}}}}public static void main(String[] args) {Example10 ex10 = new Example10();ex10.start();}}

 注:根据代码中注释的操作运行一次,你就明白什么意思了;

        如果生产者没有生产,就调用唤醒(notify)。消费者的判断会出问题(如果使用if)

        这就是为什么使用while而不是if的原因

上一篇:java 内部类
下一篇:Struts2自学笔记

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客