`

线程并发工具--阻塞队列

 
阅读更多

BlockingQueue在生产者消费者模式中运用非常广泛,生产者往队列中增加产品,消费中从队列中获取产品。在增加和删除队列元素的时候,是否阻塞是可选的,比如队列为空时再获取队列元素时,是返回空、返回null还是抛异常,下面的摘自api文档的说明:

Throws exception Special value Blocks Times out
Insert add(e) offer(e) put(e) offer(e, time, unit)
Remove remove() poll() take() poll(time, unit)
Examine element() peek() not applicable not applicable

下面是一个生成这和消费者的例子:

final ArrayBlockingQueue<String> iphones = new ArrayBlockingQueue<String>(10);
		//apple company product iphones
		new Thread(new Runnable(){
			@Override
			public void run() {
				int num = 0;
				while(true){
					try {
						Thread.sleep(500);
						iphones.put("iphone" + (++num));
						System.out.println("produce a iphone,total size is " + iphones.size());
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
		// customers
		for(int i = 0;i<3;i++){
			new Thread(new Runnable(){
				@Override
				public void run() {
					while(true){
						try {
							Thread.sleep(new Random().nextInt(5000));
							String iphone = iphones.take();
							System.out.println(Thread.currentThread().getName() + ": i get a iphone : " + iphone+",left " + iphones.size());
						}catch(Exception e){
						}
					}
				}
			}).start();
		}
部分执行结果:

produce a iphone,total size is 0
Thread-1: i get a iphone : iphone1,left 0
produce a iphone,total size is 1
Thread-1: i get a iphone : iphone2,left 0
produce a iphone,total size is 1
Thread-2: i get a iphone : iphone3,left 0
produce a iphone,total size is 1
Thread-3: i get a iphone : iphone4,left 0
produce a iphone,total size is 1
produce a iphone,total size is 2
produce a iphone,total size is 3
Thread-1: i get a iphone : iphone5,left 2
produce a iphone,total size is 3
produce a iphone,total size is 4
produce a iphone,total size is 5
Thread-2: i get a iphone : iphone6,left 4





分享到:
评论

相关推荐

    并发-线程池和阻塞队列

    在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...

    并发-线程池和阻塞队列.pdf

    阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有...

    高并发多线程处理demo-java.rar

    6. **阻塞队列(BlockingQueue)**:在多线程处理中,可能会使用阻塞队列,如`LinkedBlockingQueue`,它允许生产者线程添加任务,而消费者线程在队列为空时会被阻塞,直到有新的任务到来。这样可以确保任务被及时...

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 ...Java线程:新特征-阻塞队列 Java线程:新特征-阻塞栈 Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:大总结

    线程-线程池-锁-集合-Map-队列.docx

    综上所述,线程、线程池、集合和队列是Java并发编程的核心概念,理解和掌握它们对于开发高效、稳定的并发应用程序至关重要。在实际开发中,应根据具体需求选择合适的线程管理策略、数据结构和同步机制,以实现高性能...

    Java多线程实战精讲-带你一次搞明白Java多线程高并发

    - **ThreadPoolExecutor**:最常见的线程池实现,参数包括核心线程数、最大线程数、队列容量等。 - **ScheduledExecutorService**:支持定时和周期性任务执行的线程池。 4. **并发集合** - **并发容器**:如...

    支持多线程和泛型的阻塞队列

    总之,支持多线程和泛型的阻塞队列是一种强大的工具,它能帮助开发者构建高效、稳定的并发程序,简化多线程环境下的同步问题,并允许存储不同类型的数据。在理解和使用时,需要理解其内部原理,合理选择队列容量,...

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

    总之,Java并发编程中的阻塞队列和阻塞栈是高效并发处理的核心工具,它们通过内置的阻塞机制实现线程间的同步,简化了多线程环境下的复杂性,提升了系统性能。了解并熟练掌握这些特性,对于任何Java开发者来说都是至...

    多线程并发处理的简单实现

    总的来说,多线程并发处理是通过合理调度线程,利用任务队列作为通信桥梁,达到高效执行任务的目的。正确地使用多线程并发,不仅可以提高程序性能,还能简化同步和锁的管理,降低程序的复杂性。

    OC- 并发队列在同步线程中执行

    当在同步线程中使用并发队列时,虽然队列中的任务可以并发执行,但主线程会阻塞直到所有任务完成。这种方式适用于那些需要等待所有子任务完成后再进行下一步操作的情况。 下面是一些关于使用OC中并发队列的关键知识...

    并发编程实践,全面介绍基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具、Executor部分等

    本文将全面介绍Java并发编程的基础知识、JVM同步原语、线程安全、低级并发工具、线程安全容器、高级线程协作工具以及Executor服务。 1. **基础知识** - **并发与并行**:并发是指多个任务在同一时间段内交替执行,...

    OC-并发队列在异步线程中执行

    当我们谈论“OC-并发队列在异步线程中执行”时,我们实际上是在讨论多线程编程中的一个关键概念——GCD(Grand Central Dispatch),这是Apple提供的用于管理并发任务的高级工具。 GCD是Apple的底层任务调度系统,...

    Java并发编程--BlockingQueue.docx

    1. ArrayBlockingQueue:基于数组的有界阻塞队列,线程安全,遵循先进先出(FIFO)原则,可以通过构造函数设置容量。 2. LinkedBlockingQueue:基于链表的有界阻塞队列,默认无大小限制,也可以指定最大容量。 3. ...

    多线程与高并发-电子.pdf

    多线程与高并发是计算机科学中非常重要的两个概念,它们在提高软件程序的性能、响应速度和资源利用率方面起着至关重要的作用。在当今的互联网时代,特别是在产业互联网和5G技术的推动下,多线程和高并发的应用变得...

    多线程demo程序-轻松掌握多线程技术

    Java提供了多种机制,如wait()、notify()和notifyAll()方法,以及Semaphore、BlockingQueue等并发工具类,用于线程间的通信和协作。 7. **线程优先级**: 操作系统为每个线程分配了一个优先级,但这并不保证高...

    vc socket tcp 多线程客户端--服务器结构的例子.visual c++

    6. **多线程处理**: 为了处理多个并发连接,服务器通常会为每个新连接创建一个新线程。这样,主线程可以继续监听新的连接请求,而子线程则负责处理与特定客户端的通信。 7. **数据收发**: `send`和`recv`函数用于在...

    java并发编程-超级大全整理

    队列在并发编程中扮演重要角色,例如作为生产者-消费者模型中的缓冲区,通过阻塞队列实现线程间的同步。 ### 三、Java 并发工具 Java并发包(`java.util.concurrent`)提供了许多工具类,如`ExecutorService`、`...

    JAVA多线程并发编程

    线程并发的使用可以显著提升程序处理能力,例如在服务器端处理大量用户请求时,如果每个请求都由单独的线程处理,那么处理速度将大大提高。但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决...

    Cocoa多线程开发Objective-C详解

    同步执行需要谨慎使用,因为它会阻塞当前线程直到任务完成,可能会引起界面卡顿或死锁等问题。而异步执行则能避免这些问题,是推荐的多线程执行方式。 总的来说,Cocoa多线程开发在Objective-C中的应用主要通过GCD...

    Java线程pdf ---培训内部资料

    此外,还有“锁池”和“等待队列”两种特殊状态,分别用于描述线程在等待锁或响应特定条件时的状态。 #### 五、线程的优先级与调度 线程的优先级影响其被调度的概率。Java中的线程优先级可以通过`setPriority()`...

Global site tag (gtag.js) - Google Analytics