Java多线程处理任务(摘抄)
很多时候,我们需要对一个庞大的队列或者二维数组进行处理。这些处理可能是循环的,比如给一个excel多个sheet的联系人列表发邮件。很幼稚的方法就是用一个或者两个FOR循环搞定,对于庞大的数据有得让你等的。最要命的是当你出去喝茶的时候,程序没有处理好抛出Exception了,那你原本的计划任务都会终止。
多线程的好处是比较多的,特别是能装装B,让你从男孩变成男人的感觉。不废话了,我简化了工作中使用的一个多线程框架,做了些扩展,直接上代码:
1:多线程处理线性队列
- public static void processLineTask(final List<Object> list, int threadCount){
- //确保线程数量不大于队列长度
- threadCount = Math.min(threadCount, list.size());
- for(int i = 0;i < threadCount;i++){
- new Thread(){
- public void run(){
- while(true){
- Object o;
- //提取队列元素的时候,需要锁住队列
- synchronized(list){
- //当队列长度为0的时候,线程逐个结束
- if(list.size() == 0){
- break;
- }
- o = list.remove(0);
- }
- //这里可以写一些对元素o的操作
- //……
- }
- }
- }.start();
- }
- }
2:多线程处理环状队列
- public static void processCircleTask(final List<Object> list, int threadCount){
- //确保线程数量不大于队列长度
- threadCount = Math.min(threadCount, list.size());
- for(int i = 0;i < threadCount;i++){
- new Thread(){
- public void run(){
- while(true){
- Object o;
- //提取队列元素的时候,需要锁住队列
- synchronized(list){
- o = list.remove(0);
- }
- //这里可以写一些对元素o的操作
- //……
- //为防止小环导致循环过快,可以给每个o添加时间属性,如果间隔过小就在此sleep
- //把元素放到队列尾部
- synchronized(list){
- list.add(o);
- }
- }
- }
- }.start();
- }
- }
3:多线程处理二维数组,单线处理
- public static void processMultiListTask1(final List<List<Object>> list, int threadCount){
- //确保线程数量不大于队列长度
- threadCount = Math.min(threadCount, list.size());
- for(int i = 0;i < threadCount;i++){
- new Thread(){
- public void run(){
- while(true){
- List<Object> listSub;
- //提取值,需要锁住对象
- synchronized(list){
- if(list.size() == 0){
- break;
- }
- listSub = list.remove(0);
- }
- Object o;
- for(int i = 0;i < listSub.size();i++){
- o = listSub.get(i);
- //这里可以写一些对元素o的操作
- //……
- }
- }
- }
- }.start();
- }
- }
4:多线程处理二维数组,交叉处理
- public static void processMultiListTask2(final List<List<Object>> list, int threadCount){
- //确保线程数量不大于队列长度
- threadCount = Math.min(threadCount, list.size());
- for(int i = 0;i < threadCount;i++){
- new Thread(){
- public void run(){
- while(true){
- Object o;
- //提取值,需要锁住对象
- synchronized(list){
- if(list.size() == 0){
- break;
- }
- if(list.get(0).size() == 0){
- list.remove(0);
- }
- o = list.get(0).remove(0);
- }
- //这里可以写一些对元素o的操作
- //……
- }
- }
- }.start();
- }
- }
Java多线程处理任务(摘抄)的更多相关文章
- Java多线程处理List数据
实例1: 解决问题:如何让n个线程顺序遍历含有n个元素的List集合 import java.util.ArrayList; import java.util.List; import org.apa ...
- java多线程处理任务
最近用到使用多线程处理给用户发送站内消息的问题,想到使用java自带的线程池进行处理这个问题,具体如下: 定义一个线程: package com.qlwb.util; import org.apach ...
- Java面试宝典摘抄
1,ClassLoader知识 加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader ...
- java多线程处理
package com.copyFile; import java.io.BufferedReader;import java.io.File;import java.io.FileReader;im ...
- Java 多线程处理[全]
http://blog.csdn.net/ghsau/article/details/7421217 Java线程(一):线程安全与不安全 http://blog.csdn.net/ghsau/art ...
- Java注解知识点摘抄
Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...
- java 内部类(摘抄自网络)
Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...
- Java多线程处理某个线程超时的问题
ExecutorService exec = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = ...
- java多线程处理导入数据拆分List集合 同步处理插入数据
原文:https://www.2cto.com/kf/201612/581174.html import org.apache.log4j.Logger; import org.apache.poi. ...
随机推荐
- Exchange 2016 CU12安装报错
1. 报错信息: Exchange 2016 升级 CU12补丁报错,主要是在进行第10步安装管理工具时报SeSecurityPrivilega错误,详细如下: 查看安装log信息如下 ...
- .NETCore部署步骤
1.下载.NET CORE运行时 下载地址:https://dotnet.microsoft.com/download 2.windows安装下载的运行时 3.检查.是否安装成功 ,dotnet -- ...
- 开源PLM软件Aras详解七 在Aras的Method中如何引用外部DLL
在实际的项目中,Aras内部的方法可能并不能完全满足我们,比如Office的组件,就必须引入,那么在Aras内部的Method中,我们如何引入外部Dll文件 首先,我们新建一个Dll文件,简单的Dem ...
- 干货|CVE-2019-11043: PHP-FPM在Nginx特定配置下任意代码执行漏洞分析
近期,国外安全研究员Andrew Danau,在参加夺旗赛(CTF: Capture the Flag)期间,偶然发现php-fpm组件处理特定请求时存在缺陷:在特定Nginx配置下,特定构造的请求会 ...
- 干货 | TiDB Operator实践
干货 | TiDB Operator实践 北京it爷们儿 京东云开发者社区 4天前 K8s和TiDB都是目前开源社区中活跃的开源产品,TiDB Operator项目是一个在K8s上编排管理TiDB集 ...
- 吴裕雄--天生自然JAVA线程编程笔记:创建线程
public class ThreadRuning extends Thread{ public ThreadRuning(String name){ //重写构造,可以对线程添加名字 super(n ...
- 吴裕雄--天生自然MySQL学习笔记:MySQL 查询数据
MySQL 数据库使用SQL SELECT语句来查询数据. 可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MySQL数据库中查询数据通用 ...
- opencv python图片编码解码
cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像.cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到 ...
- go多态
package main import ( "fmt" ) type Intf interface { process() } type MsgBase struct { id ...
- 基于python的arcgis底图添加(转)
本文翻译自:Qingkai‘s Blog 当使用python的Basemap库绘制地图时,选择一个漂亮的底图会为图片增色不少,但是使用map.bluemarble().map.etopo()或者map ...