`

利用阻塞队列BlockingDeque实现生产者-消费者模式

阅读更多
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * 消费者类
 * */
public class Consumer implements Runnable {
	private BlockingDeque<String> queue = new LinkedBlockingDeque<String>();
	
	public Consumer(BlockingDeque<String> queue){
		this.queue = queue;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i = 0;
			do{
				try {
					String product = queue.take();
					if(!"".equals(product) && null != product){
						System.out.println("消费者-:"+product);
						i++;
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		
			}while(i < 50);
		}
}

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
/**
 * 生产者类
 * */

public class Producer implements Runnable {
	private BlockingDeque<String> queue = new LinkedBlockingDeque<String>();
	
	public Producer(BlockingDeque<String> queue){
		this.queue = queue;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0; i < 50; i++){
			try {
				System.out.println("生产者-Product"+i);
				queue.put("Prodect:"+i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

/**
 * 测试类
 * */
public class BlockingQueueTest {
	
	private static BlockingDeque<String> queue = new LinkedBlockingDeque<String>();
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Producer producer = new Producer(queue);
		Consumer cusumer = new Consumer(queue); 
		new Thread(cusumer).start();
		new Thread(producer).start();
	}
}
分享到:
评论

相关推荐

    Java并发编程(21)并发新特性-阻塞队列和阻塞栈(含代

    这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者消费者模型的基础。 **阻塞队列(BlockingQueue)** 阻塞队列是一种特殊的队列,当队列为空时,从队列中获取元素的操作将会被...

    线程经典问题代码

    通过查看源码,我们可以深入理解如何实现生产者-消费者模型,包括线程间的同步和通信,以及如何避免常见的并发问题,如死锁、活锁和饥饿等。 总之,生产者-消费者问题是多线程编程中的经典案例,它展示了如何在多个...

    Java 多线程与并发(16-26)-JUC集合- BlockingQueue详解.pdf

    这种设计使得它在生产者-消费者模型中非常有用,其中一个线程(生产者)生成数据,然后将其放入队列,而另一个线程(消费者)则从队列中取出并处理数据。 在`BlockingQueue`中,如果队列已满,尝试插入元素的线程会...

    java并发编程:juc、aqs

    **BlockingDeque(阻塞双端队列)**:在JUC中,`BlockingDeque`是一种线程安全的双端队列,可以用于生产者-消费者模型。与`BlockingQueue`类似,它允许一个线程生产对象,另一个线程消费对象,但`BlockingDeque`允许...

    大数据基础复习

    BlockQueue是Java并发编程中的重要工具,它是一种特殊的队列,当队列满时,生产者尝试添加元素会阻塞,直到队列有空位;当队列为空时,消费者尝试取出元素也会阻塞,直到队列中有元素可用。BlockQueue提供了一种线程...

    java多线程编程总结

    `BlockingQueue` 提供了线程安全的队列实现,可以方便地用于生产者-消费者模型。 - **阻塞栈** `BlockingDeque` 类提供了一个线程安全的双端队列实现。 - **条件变量** `Condition` 接口允许更精细地控制线程的...

    Java多线程编程总结.pdf

    生产者消费者模型是一种典型的线程协作案例,其中`BlockingQueue`(阻塞队列)是实现这一模型的常见工具。线程间通信还可以通过`wait()`、`notify()`和`notifyAll()`方法实现,但这些方法必须在同步块或同步方法中...

    浅谈Java线程并发知识点

    而`BlockingQueue`接口(如`ConcurrentLinkedQueue`和`BlockingDeque`)提供了一种线程间的通信机制,常用于实现生产者消费者模式。例如,`SynchronousQueue`是一个特殊的阻塞队列,它要求生产者与消费者精确匹配,...

    javaSE代码实例

    16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 16.4.9 防止错误的使用wait、notify、notifyAll方法 371 16.5 获取当前正在...

Global site tag (gtag.js) - Google Analytics