`
schy_hqh
  • 浏览: 556101 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(多线程)多线程之间的通信

 
阅读更多

 

多线程之间通信

如生产者与消费者的通信,操作同一个共享资源

关键:通过一个标记来控制资源的状态,使用wait与notify/notifyAll实现线程的切换

生产者负责生产,满则等待,空则生产;

消费者负责消费,空则等待,有则消费;

 

单一生产者与消费者的时候,可以使用if判断标记,使用notify唤醒对方线程

 

如果在多生产者多消费者的情况下,必须使用while判断标记,使用notifyAll唤醒对方线程

因为,只有使用while循环判断,才能避免多生产的问题(生产多个,只消费1个)

只有使用notifyAll才能保证对方线程被唤醒

因为notify有可能唤醒到的是本方线程,从而导致双方线程都等待,程序无法继续运行!

 

 

生产者与消费者

 

资源

package com.gc.thread.producer;

public class Resource{

	private String name;//资源
	
	private int No;//资源编号
	
	boolean flag = false;//仓库是否有资源
	
	/**
	 * 生产者
	 * @param name
	 */
	public synchronized void produce(String name) {
		
		//如果已经生产了,则等待消费者消费
		while(flag) {
			try {
				this.wait();//每次被唤醒都重新判断标记
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		//为商品编号
		this.name = name + (++No);

		//生产1个商品
		System.out.println(Thread.currentThread().getName()+"--->生产:" + this.name);
		
		//更新标记
		this.flag = true;
		
		//唤醒消费者(如果使用notify唤醒1个线程,不能保证一定唤醒到的是对方线程,如果唤醒到了本方线程,则可能造成双方线程都处于冻结状态,程序将无法继续运行)
		this.notifyAll();
	}
	
	/**
	 * 消费者
	 */
	public synchronized void consume() {
		//如果没有商品,则等待生产者生产
		while(!flag) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		//消费1个商品
		System.out.println(Thread.currentThread().getName()+"------>消费:" + this.name);
		
		//更新标记
		this.flag = false;
		
		//唤醒生产者
		this.notifyAll();
	}
	
}

 生产者

package com.gc.thread.producer;

public class Producer implements Runnable {

	private Resource r;
	
	public Producer(Resource r) {
		this.r = r;
	}
	
	@Override
	public void run() {
		while(true)
			r.produce("goods");
	}

}

 消费者

package com.gc.thread.producer;

public class Consumer implements Runnable {

	private Resource r;
	
	public Consumer(Resource r) {
		this.r = r;
	}
	
	@Override
	public void run() {
		while(true)
			r.consume();
	}

}

 开启线程

package com.gc.thread.producer;

public class Demo {
	public static void main(String[] args) {
		
		//资源
		Resource r = new Resource();
		
		//生产者
		Producer producer1 = new Producer(r);
		Producer producer2 = new Producer(r);
		
		//消费者
		Consumer consumer1 = new Consumer(r);
		Consumer consumer2 = new Consumer(r);
		
		new Thread(producer1).start();
		new Thread(producer2).start();
		new Thread(consumer1).start();
		new Thread(consumer2).start();
	}
}

 

 

 

分享到:
评论

相关推荐

    多线程之间的线程通信

    然而,多线程通信也存在潜在的危险。其中最常见的问题是**竞态条件(Race Condition)**,即多个线程同时访问并修改同一数据,导致结果不可预测。另一个问题是**死锁(Deadlock)**,即两个或更多线程相互等待对方释放...

    多线程之间消息通信

    "多线程之间消息通信"这一主题主要探讨了如何在不同线程间传递信息,实现有效的协作。 线程间通信(Inter-Thread Communication,ITC)是多线程编程中的核心概念,它允许线程共享数据、交换状态或者同步执行。在...

    串口通信及多线程之间通信

    多线程通信是另一个重要的主题,尤其在复杂的软件系统中。当一个程序需要执行多个任务并行时,多线程技术就显得尤为重要。在QT5中,QThread类被用来创建和管理线程。每个QThread对象代表一个独立的执行线程。然而,...

    MFC多线程之间通信

    MFC多线程之间的通信:本程序通过2个示例展示了通过自定义消息在多线程之间传递消息。

    java多线程通信图解

    java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...

    qt 中 多线程tcp通信

    首先,标题"qt 中 多线程tcp通信"表明我们要在Qt环境中实现TCP(Transmission Control Protocol)的多线程通信。TCP是一种面向连接的、可靠的传输协议,确保数据的顺序传输和错误检查。在多线程环境下,我们可以将...

    c#编写串口通讯代码 多线程实现.rar_C#串口_c# 串口多线程_c#多线程_串口多线程_串口通信

    串口通信的实现,编程环境为C#,实现技术采用了多线程方式

    Delphi API 串口通信 多线程例子.rar

    在"Delphi API 串口通信 多线程例子.rar"这个压缩包中,可能包含了一个示例项目,展示了如何使用Delphi的API和多线程技术实现串口通信。文件名"codefans.net"可能指的是一个代码分享网站,或者是一个特定的源代码...

    多线程通信ThreadDemo

    在Java编程中,多线程通信是一个重要的概念,特别是在并发编程中。`ThreadDemo`示例可能演示了如何在不同的线程之间有效地传递信息。线程通信是解决多个执行流同步和协作的关键,确保数据的一致性和正确性。以下是...

    VS2017实现Tcp socket多线程通信(C++)

    在本文中,我们将深入探讨如何使用Visual Studio 2017和C++来实现TCP套接字的多线程通信。TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的通信协议,广泛应用于互联网上的各种服务。多线程技术则允许我们...

    多线程通信和等待机制.docx

    多线程通信和等待机制是多线程编程中一个重要的概念,它们都是基于线程之间的同步和协作来实现的。其中,wait()和notify()方法是Java语言中实现多线程通信和等待机制的两个核心方法。 wait()方法是Object类的一个...

    基于MFC开发的多线程串口通信上位机

    3. **线程通信**: 可以使用消息队列或者事件对象(如CEvent)来实现线程间的通信和协作。 **四、MFCAPI串口实现** 结合MFC和API,我们可以创建一个名为MFCAPI_SerialComm的类,这个类封装了串口的打开、关闭、读写...

    C#,socket(多线程)通信

    利用多线程实现C#中socket网络通信模块,具体最大承受多少个客户端还不是很清楚,但是20个绝对没问题

    多线程与窗体之间通信实例

    在编程领域,尤其是在Windows应用程序开发中,多线程与窗体之间的通信是常见的需求,尤其在构建复杂的用户界面时。本实例将详细讲解如何在多个线程中操作多个窗体,并实现它们之间的消息传递。 首先,理解“多线程...

    多线程udp通信

    在IT领域,多线程UDP通信是一个重要的主题,特别是在开发高效、实时的网络应用程序时。在Windows Forms(Winform)环境中,多线程技术结合用户界面(UI)和网络通信可以提升程序性能,避免UI线程阻塞,提高用户体验...

    多线程实现基于TCP的Socket通信.rar

    本项目“多线程实现基于TCP的Socket通信”聚焦于在Windows环境下,如何利用C++编程语言通过多线程技术来实现高效、稳定的网络连接。下面将详细阐述涉及的知识点。 1. **TCP协议**:TCP是一种面向连接的、可靠的、...

    计算机网络多线程通信简例

    在计算机科学领域,尤其是软件开发中,多线程通信是一个重要的概念,特别是在处理并发任务和优化性能时。本文将深入探讨计算机网络中的多线程通信,以Java编程语言为例,结合"MT_WebServer"这一文件,来阐述如何实现...

    Qt多线程通讯

    Qt库提供了一种高效且方便的方式来处理多线程通信,使得开发者可以充分利用现代多核处理器的优势,提高程序的响应性和性能。本DEMO主要展示了如何在Qt中利用信号槽机制实现主线程与子线程之间的通信。 首先,我们要...

    操作系统中多线程之间通信

    操作系统中的多线程通信是并发编程中的核心概念,它允许不同的执行线程在共享资源时进行协调和数据交换。在本文中,我们将深入探讨多线程通信的重要性、常见方法以及如何解决经典的问题——读者写者问题。 首先,多...

    网口通信(多线程)_socket通讯_多线程_

    本主题将深入探讨“网口通信(多线程)”以及如何利用Socket进行通讯,同时结合多线程技术来提升性能和效率。 首先,让我们理解什么是Socket。Socket是操作系统提供的一个接口,它允许应用程序通过网络进行通信。在...

Global site tag (gtag.js) - Google Analytics