`

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

阅读更多
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 {
		
		@Override
		public 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 {
		
		@Override
		public 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的原因

1
2
分享到:
评论
1 楼 cuisuqiang 2013-01-25  
没什么说的

相关推荐

    c++多线程的创建挂起执行与销毁

    否者就失去了多线程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //线程入口函数 { lpthread temp=(lpthread)pthread;//参数强制转换为结构体类型 temp-&gt;progress-&gt;SetPos(temp-&gt;pos); //设置被传递过来的...

    c#多线程抓取网页内容

    多线程在C#中并不难实现。它有一个命名空间:System.Threading,提供了多线程的支持。 要开启一个新线程,需要以下的初始化: ThreadStart startDownload = new ThreadStart( DownLoad ); //线程起始设置:即每个...

    C++ 实现 暂停、继续、停止线程的线程类 和 Demo

    简单的说就是用开辟一个线程用来监测两个事件(while 循环,循环内包含了你想要处理的动作,比如此例中的更新进度条),通过控制两个事件的状态来控制循环的启动、暂停和继续。 有个小Bug: BOOL CFThread::...

    C、C++语言线程库的使用

    在 C 语言中,使用线程库来实现多线程编程需要包含头文件 `&lt;pthread.h&gt;`,并使用 `-pthread` 选项来链接线程库。在使用线程库时,需要了解线程的基本概念,如线程的创建、线程的同步、线程的通信等。 线程的创建...

    java笔记.docx

    Java中的多线程编程可以使用Thread类和Runnable接口实现。 Java中的泛型可以让代码更加通用和类型安全。 Java中的注解可以让开发人员添加元数据和标记代码。 Java中的集合类是用于处理数据的集合的框架,包括List、...

    tcl实例入门教程(包括常用的socket多线程xml解析数据库操作大量实例)

    知识点覆盖比较全面,要个20分不过分吧,有几本书认真讲过那些常用模块: socket, 数据库操作,xml解析,多线程,最具体的做法多半是一带而过,我可是一个例子一个例子做出来的。 把目录发给大家看看: 2.1 第1课:...

    2022年java实验报告总结.doc

    Java 语言中有多种循环语句,包括 for 循环、while 循环和 do-while 循环等。了解循环语句的使用场景和优先级是 Java 程序设计的基础。 六、数组 数组是 Java 语言中存储多个数据的数据结构。Java 语言中有多种...

    Java笔试试卷3.pdf

    8. 关于选择结构的说明:if 语句和 else 语句可以单独出现或成对出现,switch 结构中每个 case 语句必须用 break 语句,while 循环和 do...while 循环的区别是:while 循环是先判断后执行,而 do...while 循环是先...

    C语言关键词解释.pdf

    * register:register关键字用于指定变量为寄存器变量,建议编译器将变量存储到寄存器中使用。 * extern:extern关键字用于指定变量为外部变量,即标示变量或者函数的定义在别的文件中。 * const:const关键字用于...

    基于JSON文件API配置和C语言的多线程高并发服务器.zip

    C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和...

    .net C#线程超时

    .net C#线程超时的解决方案,使用的时候在被调线程入口调用一下这个方法就可以。更多详细代码见附件 Report.RegisterThread(Report.GetCurrentWin32ThreadID(),Thread.CurrentThread); #region 获取当取线程的...

    基于C语言编写的,多线程小型web服务器,实现简单的主页回显和web CGI(三个函数).zip

    C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和...

    Java面试必看基础知识

    Java 中的多线程编程可以使程序更加高效。可以使用 Thread 类或 Runnable 接口来创建线程,并使用 synchronized 关键字来实现线程同步。 Java 语言基础 Java 语言基础知识包括变量、数据类型、运算符、控制结构、...

    C#和数据库开发,记录了我个人的笔记

    选择结构包括if语句和switch语句两种,循环结构包括for循环、while循环、foreach循环等。例如,if语句可以用于判断用户的输入,而foreach循环可以用于遍历数组或集合。 引用传递 引用传递是一种参数传递方式。引用...

    2022年自考04747Java语言程序设计一简答题全集.doc

    java 中的分支语句包括 if 语句和 switch 语句,循环语句包括 while 语句、do-while 语句和 for 语句。 在 Java 语言中,++x 和 x++ 是两种不同的表达式。++x 表达式在使用 x 之前,先使 x 的值加 1,而 x++ 表达式...

    Java试题附答案.pdf

    22. for循环和while循环都是循环结构,while循环判断条件一般是程序结果,for循环判断条件一般是非程序结果。 23. 访问数组中的第一个值是通过array[0]来实现的。 24. 字符串比较应该使用equals()方法,而不是使用...

    《C++编程艺术》教程+代码

    2.3.6 是否使用多线程 10 2.3.7 何时回收垃圾 10 2.3.8 关于auto_ptr 11 2.4 一个简单的C++垃圾回收器 11 2.5 详细讨论GCPtr 23 2.5.1 GCPtr的数据成员 23 2.5.2 函数findPtrInfo() 24 2.5.3 GCIterator typedef 25 ...

Global site tag (gtag.js) - Google Analytics