java并发操作
项目中常用的java并发操作
一、java8新特性java并发流操作(结合纳姆达表达式)
List<String> list = new ArrayList<>();
list..stream().parallel().forEach(list1 ->{
// 调用方法 method
});
注:其中list1为list一个子集。然后通过java流(steam)操作并发(parellel),同时开启多个线程去执行方法(method);
所以当一个线程执行完成之后会继续执行集合中另外的子集,直到list循环结束。
二、采用阻塞队列的形式
1、List<Qcbatch> qcBatchList = new ArrayList<>();
注:QcBatch 为一个对象,此处为一个示例,然后在qcBatchList 集合中放入自己的元素
2、// 创建阻塞队列跑批
ConcurrentLinkedQueue<QcBatch> queue = new ConcurrentLinkedQueue<>(); // 线程同步的队列
queue.addAll(qcBatchList );
int count = 10; // 此处为设置线程数位10
final CountDownLatch countDownLatch = new CountDownLatch(count); //将线程放入计数器中
注:CountDownLatch是Java1.5之后引入的Java并发工具类,放在java.util.concurrent包下,CountDownLatch能够使一个或多个线程等待其他线程完成 各自的工作后再执行
3.循环操作线程
for (int i = 0; i < count; i++) {
new Thread(() -> {
CheckResult<QcBatch> t;
try {
// queue.poll 从队列中删除第一个元素,知道为空,会返回null对象(与remove()有些不同)
while ((t = queue.poll()) != null) {
// 此处调用自己的业务逻辑
}
} finally {
countDownLatch.countDown(); // 每调用一次这个方法,在构造函数中初始化的count值就减1
//所以当N个线程都调 用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。
}
}).start();
}
countDownLatch.await(); // 等待所有跑批线程执行结束
两种方式比较:第一种方式是每个线程各自执行,任务会有先后顺序;
第二种方式是等时执行,在效果上是同一时间完成10个任务;
所以我们在实际项目中要根据不同的情况来选择哪种方式
java并发操作的更多相关文章
- Java并发编程(您不知道的线程池操作)
Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...
- JAVA 1.5 局部特性(可变参数/ANNOTATION/并发操作)
1: 可变参数 可变参数意味着可以对某类型参数进行概括,例如十个INT可以总结为一个INT数组,当然在固定长度情况下用数组是很正常的 这也意味着重点是可变,不定长度的参数 PS1:对于继承和重写我没有 ...
- Java并发--Java中的CAS操作和实现原理
版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/CringKong/article/deta ...
- 深入浅出 Java Concurrency (36): 线程池 part 9 并发操作异常体系[转]
并发包引入的工具类很多方法都会抛出一定的异常,这些异常描述了任务在线程池中执行时发生的例外情况,而通常这些例外需要应用程序进行捕捉和处理. 例如在Future接口中有如下一个API: java.uti ...
- Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理
Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...
- 原创】Java并发编程系列2:线程概念与基础操作
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...
- 多线程的通信和同步(Java并发编程的艺术--笔记)
1. 线程间的通信机制 线程之间通信机制有两种: 共享内存.消息传递. 2. Java并发 Java的并发采用的是共享内存模型,Java线程之间的通信总是隐式执行,通信的过程对于程序员来说是完全透 ...
- 【Java并发编程实战】----- AQS(四):CLH同步队列
在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...
- 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport
在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...
随机推荐
- C#和C++的区别(一)
C#特性 1.指针可以有++.--运算,引用不可以运算: 2.类或结构的默认访问类型是internal 类的所有成员,默认是private 3.属性:用于定义一些命名特性,通过它来读取和写入相关的特性 ...
- Storm编程入门API系列之Storm的定时任务实现
概念,见博客 Storm概念学习系列之storm的定时任务 Storm的定时任务,分为两种实现方式,都是可以达到目的的. 我这里,分为StormTopologyTimer1.java 和 Sto ...
- 第八届蓝桥杯省赛C/C++ A组第4题 方格分割
参考了http://blog.csdn.net/y1196645376/article/details/69718192,这个大哥的思路很巧妙. 思路: dfs. 实现: #include <i ...
- 关于defineProperty
var c=0; Object.defineProperty(this,'b',{ get :function(){ return ++c; } }) console.log(b===1&&a ...
- Android 读取asset文件
* * 从Assets中读取图片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; As ...
- jq封装插件
$.extend()拓展方法: $(function(){ $.extend({ money:function(){ alert("我要努力赚钱") }, money:functi ...
- 数据分片存储,mycat服务器
关闭防火墙和selinux,配置yum源配置21 .22 数据库(这里以21为例)[root@host21 ~]# tar -xf mysql-5.7.17.tar[root@host21 ~]# y ...
- solr 6.5.1 linux 环境安装
前言 最近在研究搜索引擎,准备搭建一套属于自己的搜索APP,用于搜索的数据我已通过scrapy抓到本地了,现在需要一个搜索引擎来跑这些数据.于是选择了基于Lucene的solr来为我做搜索引擎的工作. ...
- Flask框架 之第一个Flask程序
from flask import Flask # 创建flask应用对象 # __name__ 代表当前模块名称 # flask以当前目录为总目录,static目录为静态目录,templates为模 ...
- spring用来干什么,解决的问题
// 1. 实体类 class User{ } //2. dao class UserDao{ .. 访问db } //3. service class UserService{ UserDao ...