import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
*测试多线程操作共享数据(互斥)
*/
publicclass BlockingQueueTest {
publicstaticvoid main(String[] args) {
final BlockingQueue queue = new ArrayBlockingQueue(3);
for(inti=0;i<2;i++){
new Thread(){
publicvoid run(){
while(true){
try {
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName() + "准备放数据!");
queue.put(1);
System.out.println(Thread.currentThread().getName() + "已经放了数据," +
"队列目前有" + queue.size() + "个数据");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
new Thread(){
publicvoid run(){
while(true){
try {
//将此处的睡眠时间分别改为100和1000,观察运行结果
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "准备取数据!");
queue.take();
System.out.println(Thread.currentThread().getName() + "已经取走数据," +
"队列目前有" + queue.size() + "个数据");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
2.多线程间通信
可以与condition相同的功能,通过队列的阻塞功能来实现多线程间通信)
import java.util.Collections;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
importjava.util.concurrent.atomic.AtomicInteger;
publicclass BlockingQueueCommunication {
publicstaticvoid main(String[] args) {
final Business business = new Business();
new Thread(
new Runnable() {
publicvoid run(){
for(inti=1;i<=50;i++){
business.sub(i);
}
}
}
).start();
for(inti=1;i<=50;i++){
business.main(i);
}
}
static class Business {
BlockingQueue<Integer> queue1 = new ArrayBlockingQueue<Integer>(1);
BlockingQueue<Integer> queue2 = new ArrayBlockingQueue<Integer>(1);
{
Collections.synchronizedMap(null);
try{
System.out.println("xxxxxdfsdsafdsa");
queue2.put(1);
}catch(InterruptedException e){
e.printStackTrace();
}
}
public void sub(inti){
try {
queue1.put(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(intj=1;j<=10;j++){
System.out.println("sub thread sequece of " + j + ",loop of " + i);
}
try {
queue2.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void main(inti){
try {
queue2.put(1);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for(intj=1;j<=100;j++){
System.out.println("main thread sequece of " + j + ",loop of " + i);
}
try {
queue1.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
阻塞队列是一种在多线程编程中广泛使用的并发数据结构,它在计算机科学和编程领域,特别是Java和C++等面向对象语言中扮演着重要角色。标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多...
Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...
总的来说,多线程并发处理是通过合理调度线程,利用任务队列作为通信桥梁,达到高效执行任务的目的。正确地使用多线程并发,不仅可以提高程序性能,还能简化同步和锁的管理,降低程序的复杂性。
阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有...
在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...
总结来说,多线程操作日志队列是高效处理日志的关键技术,涉及到了多线程并发控制、队列数据结构、线程池管理、生产者消费者模型等多个核心知识点,为系统提供了灵活、高效且可靠的日志处理能力。
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...
在IT行业中,多线程和队列是两个关键的概念,特别是在并发编程和高效系统设计中。本篇文章将深入探讨这两个概念及其结合应用。 首先,让我们理解“多线程”。多线程是计算机程序设计中的一个技术,允许一个应用程序...
在.NET编程中,多线程和异步处理是提高应用程序性能和响应能力的关键技术。本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步...
工作队列(Work Queue)是一种在多线程编程中广泛使用的模式,用于协调并发任务的执行,优化系统资源的利用并提高程序的响应速度。在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务...
在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞队列(Blocking Queue)是Java并发包...
在Java并发编程中,阻塞队列和阻塞栈是两个重要的并发数据结构,它们在多线程环境下的高效通信和资源管理中扮演着至关重要的角色。这些数据结构源自Java的并发包`java.util.concurrent`,是实现并发设计模式如生产者...
随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来支持高效的多线程编程,其中`BlockingQueue`接口便是...
1. **并发队列**:在多线程或多进程环境中用于协调数据交换的数据结构,保证了先进先出(FIFO)的原则。 2. **非阻塞算法**:确保即使在某些线程执行缓慢或被延迟的情况下,其他线程也能继续完成其操作。这类算法提供...
阻塞队列在多线程环境中特别有用,因为它允许线程在队列满时等待,直到有空间可用;同样,当队列为空时,取元素的线程也会被阻塞,直到有新的元素插入。 常见的`BlockingQueue`实现包括`ArrayBlockingQueue`、`...
我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。我们来讨论另外一类容器:阻塞队列。 在前面我们...
总之,多线程任务队列是并发编程中的重要工具,通过合理的同步和调度策略,可以有效利用多核处理器资源,提高软件的并发处理能力和响应速度。在C++中实现这样的队列,需要掌握线程同步、线程池和合适的数据结构等...
在实际的多线程并发通信实现中,服务器端需要维护一个线程池,当有新的连接请求时,从线程池中获取一个空闲线程处理请求,处理完成后线程返回线程池。这种方式提高了系统的并发性能,同时也保证了资源的有效利用。 ...
但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决这些问题,Java提供了多种同步机制。`synchronized`关键字用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块,从而避免...
在IT行业中,多线程和消息队列是两种常见的并发处理和系统通信技术。多线程使得一个程序能够同时执行多个任务,而消息队列则是实现进程间通信(IPC)的有效方式,尤其在分布式系统中广泛应用。下面我们将深入探讨这...