Java ConcurrentLinkedQueue队列线程安全操作

简介: Java ConcurrentLinkedQueue队列线程安全操作代码示例:package async;import java.


Java ConcurrentLinkedQueue队列线程安全操作

代码示例:

package async;

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 
 * 线程安全队列Queue实现计算科学古老的线程同步问题:生产者-消费者模型
 * 
 * @author phil
 *
 */
public class Demo {
	public static void main(String[] args) {
		// 线程操作安全队列,装载数据
		Queue<String> queue = new ConcurrentLinkedQueue<String>();

		// 消费者线程:不断的消费队列中的数据
		// 该线程不停的从队列中取出队列中最头部的数据
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true) {
					// 从队列的头部取出并删除该条数据
					String s = queue.poll();

					if (s != null) {
						System.out.println(System.currentTimeMillis() + "取出数据:" + s);
					}
				}
			}

		}).start();

		// 生产者线程A:不断的生产单个数据并装入队列中
		// 该线程模拟不停的在队列中装入一个数据
		new Thread(new Runnable() {
			private int count = 0;
			private int number = 0;

			@Override
			public void run() {
				while (true) {
					number = count++;
					System.out.println("装载数据:" + number);
					queue.add(String.valueOf(number));

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

		}).start();

		// 生产者线程B:不断的生产批量数据并装入队列中
		// 该线程模拟不停的在队列中装入一批数据
		new Thread(new Runnable() {
			private List<String> lists = new ArrayList<String>();
			private int count = 0;

			@Override
			public void run() {
				while (true) {
					// 一批数据的数量,不定长
					count = (int) (Math.random() * 5);
					for (int i = 0; i < count; i++) {
						lists.add("批量数据-" + i + "," + Math.random());
					}

					queue.addAll(lists);
					lists.clear();

					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}

		}).start();
	}
}


代码运行结果:

装载数据:0
1490417519703取出数据:0
1490417519705取出数据:批量数据-0,0.9045746291285363
装载数据:1
1490417520703取出数据:1
1490417520705取出数据:批量数据-0,0.9378737341890285
1490417520705取出数据:批量数据-1,0.5609780480099475
1490417520705取出数据:批量数据-2,0.27383078038481046
1490417520705取出数据:批量数据-3,0.6824300990854635
装载数据:2
1490417521704取出数据:2
1490417521706取出数据:批量数据-0,0.23916865770830298
装载数据:3
1490417522704取出数据:3
1490417522706取出数据:批量数据-0,0.4169859285695523
1490417522706取出数据:批量数据-1,0.6667611178989155
1490417522706取出数据:批量数据-2,0.9026516620769446
1490417522706取出数据:批量数据-3,0.3491566771349188
装载数据:4
1490417523705取出数据:4
1490417523707取出数据:批量数据-0,0.5634243124726268
1490417523707取出数据:批量数据-1,0.4021826644433847
装载数据:5
1490417524705取出数据:5
1490417524707取出数据:批量数据-0,0.9431588628811881
1490417524707取出数据:批量数据-1,0.8762171226841987
1490417524707取出数据:批量数据-2,0.0470837112538508
装载数据:6
1490417525705取出数据:6
1490417525707取出数据:批量数据-0,0.31099249499423265
1490417525707取出数据:批量数据-1,0.7660770869693369
1490417525707取出数据:批量数据-2,0.3209338524956993
1490417525707取出数据:批量数据-3,0.2525376039263991
装载数据:7
1490417526706取出数据:7
1490417526708取出数据:批量数据-0,0.6369286896471094



致谢:
冯贵兵对本文有重大贡献!

附录:
1,《Java同步机制:synchronized,wait,notify》链接地址:http://blog.csdn.net/zhangphil/article/details/43800949
2,《Java线程同步:生产者-消费者 模型(代码示例)》链接地址:http://blog.csdn.net/zhangphil/article/details/43800967

相关文章
|
1天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第7天】在Java中,多线程编程是提高应用程序性能和响应能力的关键。本文将深入探讨Java并发编程的核心概念,包括线程安全、同步机制以及性能优化策略。我们将通过实例分析,了解如何避免常见的并发问题,如死锁、竞态条件和资源争用,并学习如何使用Java提供的并发工具来构建高效、可靠的多线程应用。
|
1天前
|
缓存 Java
Java并发编程:深入理解线程池
【5月更文挑战第7天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将了解线程池的基本概念,以及如何使用Java的Executor框架来创建和管理线程池。此外,我们还将讨论线程池的优点和缺点,以及如何选择合适的线程池大小。最后,我们将通过一个示例来演示如何使用线程池来提高程序的性能。
|
2天前
|
安全 Java
Java中的并发编程:理解并发性与线程安全
Java作为一种广泛应用的编程语言,在并发编程方面具有显著的优势和特点。本文将探讨Java中的并发编程概念,重点关注并发性与线程安全,并提供一些实用的技巧和建议,帮助开发人员更好地理解和应用Java中的并发机制。
|
2天前
|
Java
Java中的多线程编程:基础知识与实战技巧
【5月更文挑战第6天】多线程编程是Java中的一个重要特性,它允许我们在一个程序中同时执行多个任务。本文将介绍Java多线程的基础知识,包括线程的创建、启动、同步和通信,以及如何在Java中实现多线程编程。通过实例代码和解析,帮助读者深入理解Java多线程编程的概念和应用。
|
3天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第5天】在现代软件开发中,多线程编程是一个重要的概念,尤其是在Java这样的多平台、高性能的编程语言中。通过多线程,我们可以实现并行处理,提高程序的运行效率。本文将介绍Java中多线程编程的基础知识,包括线程的概念、创建和控制方法,以及一些常见的多线程问题和解决方案。
|
6天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
23 3
|
6天前
|
XML 前端开发 Oracle
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
16:JSP简介、注释与Scriptlet、Page指令元素、Include操作、内置对象、四种属性-Java Web
10 2
|
6天前
|
Java
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识
JAVA难点包括异常处理、多线程、泛型和反射,以及复杂的分布式系统知识。入坑JAVA因它的面向对象特性、平台无关性、强大的标准库和活跃的社区支持。
28 2
|
6天前
|
Java 调度 开发者
Java中的多线程编程:基础与实践
【5月更文挑战第2天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的理解和实践指导。我们将首先介绍线程的基本概念和重要性,然后详细解析Java中实现多线程的两种主要方式:继承Thread类和实现Runnable接口。接着,我们将探讨线程同步的问题,包括synchronized关键字和Lock接口的使用。最后,我们将通过一个实际的生产者-消费者模型来演示多线程编程的实践应用。
|
6天前
|
安全 Java 程序员
Java中的多线程编程:从理论到实践
【5月更文挑战第2天】 在计算机科学中,多线程编程是一项重要的技术,它允许多个任务在同一时间段内并发执行。在Java中,多线程编程是通过创建并管理线程来实现的。本文将深入探讨Java中的多线程编程,包括线程的概念、如何创建和管理线程、以及多线程编程的一些常见问题和解决方案。
17 1