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的原因
相关推荐
以下将详细讲解如何在Qt中使用多线程防止界面假死,并给出一种有效的方法。 1. Qt中的线程模型 Qt提供了两种线程模型:QThread类和信号槽跨越线程的能力。QThread是Qt中处理线程的基础类,可以创建新的线程并运行...
在这个例子中,我们看到如何使用多线程来同时运行两个`while`循环,每个循环都在不同的线程中运行。这允许我们在不阻塞主线程的情况下执行并发任务。 补充知识:在Python中,可以使用`zip`函数同时遍历两个列表。...
本实例将详细讲解如何在多线程中使用C#的Queue类。 首先,我们创建一个队列实例,通过`new Queue()`来指定存储的数据类型。在本例中,队列存储的是字符串类型(string),所以是`Queue<string>`。接着,我们填充...
为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...
在Qt框架中,多线程是提升应用程序性能和响应性的重要技术。QThread类是Qt提供的用于线程操作的工具,它使得线程管理变得更加方便,尤其在UI更新和耗时计算任务之间需要分离时。本篇文章将深入探讨如何利用QThread来...
在Python编程中,多线程是一种并发执行任务的机制,尤其在处理I/O密集型任务如网络请求时,能够显著提高程序效率。本教程将详细讲解如何使用Python的多线程来实现对多个网址的快速访问,并记录访问结果。 首先,...
在C#编程中,多线程技术是一种关键的性能优化手段,尤其对于处理耗时操作时,能够确保用户界面(UI)的响应性,避免出现界面卡死的现象。本解决方案将深入探讨如何利用C#的多线程特性来解决这个问题。 一、线程基础...
在IT行业中,网络编程是不可或缺的一部分,特别是在服务器端开发中,使用TCPServer编写多线程的socket服务是一项基础但重要的技术。本文将详细讲解如何使用TCPServer来实现这样的服务,以及多线程在其中的作用。 ...
在这个"多线程依次循环打印26个英文字母"的问题中,我们主要关注如何在多个线程之间同步操作,确保字母按照顺序正确地输出。这里涉及了`条件队列`和`lock`两个关键概念。 首先,让我们理解一下`多线程`。在单核...
在 C++ 中,多线程编程是通过使用 `std::thread` 类来实现的。`std::thread` 类用于创建一个新的线程,并执行指定的函数。多线程编程可以提高程序的执行效率,特别是在需要并发执行多个任务的情况下。 互斥锁 在多...
否者就失去了多线程的意义) DWORD WINAPI ThreadFun(LPVOID pthread) //线程入口函数 { lpthread temp=(lpthread)pthread;//参数强制转换为结构体类型 temp->progress->SetPos(temp->pos); //设置被传递过来的...
本文基于一篇关于使用C#语言实现多线程网页抓取的技术文章,深入探讨了如何通过多线程技术优化网页抓取效率,解决了单线程抓取过程中存在的主要问题。 #### 单线程抓取存在的问题 单线程抓取存在的主要问题包括: 1...
在多线程编程中,为了避免多个线程同时访问同一资源导致的数据不一致问题,通常需要使用锁机制来同步线程的执行顺序。Python的`threading`模块提供了一种名为`RLock`的递归锁,它可以被同一个线程多次获得而不释放。...
总的来说,通过在Qt中使用对象的继承方式,我们可以创建一个专门处理串口通信的线程,这样既保持了主线程的流畅性,又确保了串口操作的安全性。这在开发涉及实时数据传输或设备控制的项目中是非常实用的技术手段。在...
根据给定的文件信息,我们可以总结出以下几个关键的知识点: ### 1. 使用Form进行界面设计 在.NET框架中,Windows Forms(简称...虽然代码中使用了一些已废弃的方法,但整体逻辑清晰,有助于理解这些概念的基本应用。
在Java编程中,多线程并发机制是一种关键的技术,它允许多个任务或操作在同一时间进行,从而提高程序的执行效率。在这个例子中,我们看到一个简单的Java多线程程序,用于模拟售票系统,其中有两个类`SellThread`和`...
### VC多线程下实现串口通讯的知识点详解 #### 一、背景介绍与基础知识概述 在现代化的各种实时监控系统及通信系统中,利用VC++(Visual C++)对RS-232串行接口(简称串口)进行编程是非常常见的技术手段。尤其在...
在现代网络爬虫技术中,为了提高数据抓取的速度与效率,通常会采用多线程技术来实现并发处理。本文档将深入探讨如何在C#语言环境下实现蜘蛛爬虫程序的多线程控制,并通过具体代码示例来阐述其工作原理。 #### 一、...
然而,在实际应用中,多线程编程也面临着诸多挑战,尤其是当多个线程共享资源时,可能会引发数据一致性问题。Java作为一种广泛使用的编程语言,提供了强大的多线程支持。本文旨在通过分析一个具体的案例——长途汽车...
在shell脚本中,可以使用条件语句(if...else)、循环(for、while)等结构,以及读取配置文件(source)的功能来实现上述功能。例如,读取一个包含配置信息的`.ini`文件,并根据文件内容动态生成`mysqldump`命令。 ...