`

线程之间通信2

    博客分类:
  • java
 
阅读更多

用 wait/notify模拟实现一个 BlockingQueue

 

public class MyQueue {

	//承装元素的集合
	private final LinkedList<Object> list = new LinkedList<Object>();
	
	//计算器
	private AtomicInteger count = new AtomicInteger(0);
	
	private final int minSize = 0;
	
	private final int maxSize;
	
	public MyQueue(int size) {
		this.maxSize = size;
	}

	// 初始化一个锁对象 
	
	private final Object lock = new Object();
	
	public void put(Object obj){
		synchronized (lock) {
			while (count.get()==this.maxSize) {
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//1.加入元素
			list.add(obj);
			//2.计数器累加
			count.incrementAndGet();
			//3.通知另外的线程
			lock.notify();
			System.out.println(" 新加入的元素:"+obj);
		}
	}
	
	
	public Object take(){
		Object ret = null;
		synchronized (lock) {
			while (count.get()==this.minSize) {
				try {
					lock.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			ret = list.removeFirst();
			count.decrementAndGet();
			lock.notify();
		}
		return ret;
	}
	
	
	public int getSize(){
		return this.count.get();
	}
	
	
	public static void main(String[] args) {
		final MyQueue queue = new MyQueue(5);
		queue.put("1");
		queue.put("2");
		queue.put("3");
		queue.put("4");
		queue.put("5");
		
		System.out.println("当前 queue 长度:"+queue.getSize());
		
		
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				queue.put("a");
				queue.put("b");
			}
		},"t1");
		
		t1.start();
		
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("t2 take:" +queue.take());
				System.out.println("t2 take:" +queue.take());
			}
		},"t2");
		
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		t2.start();
	}
	
}

 

分享到:
评论

相关推荐

    多线程之间的线程通信

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

    qt 中 多线程tcp通信

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

    Qt线程之间通信、线程和进程之间通信实例

    4. `QSemaphore`:控制对资源的并发访问数量,用于线程之间的资源调度。 二、Qt线程与进程间通信 线程和进程间的通信比线程间通信复杂,因为它们各自拥有独立的地址空间。Qt提供了多种方式来实现这一目标: 1. `...

    java多线程通信图解

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

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

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

    MFC多线程之间通信

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

    多线程通信ThreadDemo

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

    多线程之间消息通信

    在计算机编程中,多线程是并发执行任务的一种方式,特别是在多核...通过对"MultiThread7"这个示例的学习,开发者可以更深入地理解Windows下的线程通信机制,并将其应用到自己的项目中,提升软件的性能和用户体验。

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

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

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

    2. **线程同步**: 在多线程环境中,线程间的数据交换可能需要同步机制,如CSingleLock、CMultiLock或CRITICAL_SECTION等,防止数据竞争问题。 3. **线程通信**: 可以使用消息队列或者事件对象(如CEvent)来实现线程...

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

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

    MFC线程间通信

    在编程领域,多线程应用是提升程序性能和并发处理能力的重要手段。然而,当一个应用程序中有多个线程运行时,它们可能需要共享数据或协调工作,这就涉及到线程间通信(Inter-Thread Communication,简称ITC)。MFC...

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

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

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

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

    多线程udp通信

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

    C#,socket(多线程)通信

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

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

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

    VC利用管道和多线程实现进程间通信

    VC利用管道和多线程实现进程间通信 VC++环境下利用管道和线程实现进程间通信的技术是指在Windows操作系统中,使用Visual C++语言,通过创建管道和线程来实现进程之间的通信。这种技术可以在不同的进程之间实现信息...

    C++实现多线程通信

    在C++编程中,多线程通信是并发执行任务时必不可少的一个环节,它涉及到线程间的同步和数据共享。在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理...

    android线程之间通信原理

    本例中简单运用了线程间通信原理,简单明了,适合初学线程通信

Global site tag (gtag.js) - Google Analytics