Java队列之LinkedTransferQueue

简介: 如何应用合适的队列,这就是经验了。 如何在队列里容纳多个线程,及多个线程处理同一个队列?

每个知识点都尽量涉及到,

但每种队列应用的场景都不一样的,

如何应用合适的队列,这就是经验了。

如何在队列里容纳多个线程,及多个线程处理同一个队列?

应该算是JAVA里比较深入的思考了。

7e94468e74a20b6f764ef683b99407d82d91e8b5

producer


package demo.thread;

import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TransferQueue;

public class Producer implements Runnable {
	private final TransferQueue<String> queue;
	public Producer(TransferQueue<String> queue) {
		this.queue = queue;
	}
	
	private String produce() {
		return "Your lucky number " + (new Random().nextInt(100));
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			while (true) {
				if (queue.hasWaitingConsumer()) {
					queue.transfer(produce());
				}
				TimeUnit.SECONDS.sleep(1);
			}
		} catch (InterruptedException e){
			
		}
		
	}

}


consumer


package demo.thread;

import java.util.concurrent.TransferQueue;

public class Consumer implements Runnable{
	private final TransferQueue<String> queue;
	public Consumer(TransferQueue<String> queue) {
		this.queue = queue;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			System.out.println("Consumer " + Thread.currentThread().getName() + queue.take());
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}

}


main


package demo.thread;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;

public class ThreadMain {
	public static void main(String[] args) {
		TransferQueue<String> queue = new LinkedTransferQueue<String>();
		Thread producer = new Thread(new Producer(queue));
		producer.setDaemon(true);
		producer.start();
		
		for (int i = 0; i < 10; i++) {
			Thread consumer = new Thread(new Consumer(queue));
			consumer.setDaemon(true);
			consumer.start();
			try {
				Thread.sleep(1000L);
			} catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		
	}

}


output


Consumer Thread-1Your lucky number 33
Consumer Thread-2Your lucky number 51
Consumer Thread-3Your lucky number 8
Consumer Thread-4Your lucky number 35
Consumer Thread-5Your lucky number 29
Consumer Thread-6Your lucky number 8
Consumer Thread-7Your lucky number 46
Consumer Thread-8Your lucky number 20
Consumer Thread-9Your lucky number 15
Consumer Thread-10Your lucky number 67



目录
相关文章
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
31 2
|
6月前
|
算法 Java
Java数据结构——队列
Java数据结构——队列
47 4
|
2月前
|
Java API 容器
JAVA并发编程系列(10)Condition条件队列-并发协作者
本文通过一线大厂面试真题,模拟消费者-生产者的场景,通过简洁的代码演示,帮助读者快速理解并复用。文章还详细解释了Condition与Object.wait()、notify()的区别,并探讨了Condition的核心原理及其实现机制。
|
1月前
|
存储 算法 Java
【用Java学习数据结构系列】用堆实现优先级队列
【用Java学习数据结构系列】用堆实现优先级队列
31 0
|
3月前
|
Java
java中的队列
这篇文章通过Java代码示例介绍了使用数组实现队列操作,包括队列的初始化、入队、出队、判断队列满和空以及遍历队列的方法。
java中的队列
|
4月前
|
设计模式 安全 Java
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
44 1
|
5月前
|
Java 开发者
揭秘!LinkedList是如何华丽变身成为Java队列之王的?
【6月更文挑战第18天】Java的`LinkedList`既是列表也是队列之星,实现`Queue`接口,支持FIFO操作。其内部的双向链表结构确保了添加/移除元素的高效性(O(1)),适合作为队列使用。它线程不安全,但可通过同步包装用于多线程环境。此外,`LinkedList`还能灵活变身栈或双端队列,提供多种数据结构功能。
58 11
|
5月前
|
Java
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
38 1
|
5月前
|
安全 Java
Java Queue新玩法:用LinkedList打造高效队列,让你的代码飞起来!
【6月更文挑战第18天】Java集合框架中的`LinkedList`不仅是列表,还可作为高效队列。由于其在链表两端进行添加/移除操作的时间复杂度为O(1),故适合实现并发环境下的任务队列。通过案例展示了如何创建、添加任务及确保线程安全,揭示了`LinkedList`提升代码性能的秘密,特别是在多线程应用中的价值。
51 4
|
5月前
|
安全 Java 调度
Java Queue深度解析:LinkedList为何成为队列的最佳实践?
【6月更文挑战第18天】Java的`LinkedList`适合作为队列,因其双向链表结构支持O(1)的头尾操作。非线程安全的`LinkedList`在单线程环境下效率高,多线程时可通过`Collections.synchronizedList`封装。此外,它还可兼做栈和双端队列,提供任务调度的高效解决方案。
66 3