很多时候,我们需要对一个庞大的队列或者二维数组进行处理。这些处理可能是循环的,比如给一个excel多个sheet的联系人列表发邮件。很幼稚的方法就是用一个或者两个FOR循环搞定,对于庞大的数据有得让你等的。最要命的是当你出去喝茶的时候,程序没有处理好抛出Exception了,那你原本的计划任务都会终止。

多线程的好处是比较多的,特别是能装装B,让你从男孩变成男人的感觉。不废话了,我简化了工作中使用的一个多线程框架,做了些扩展,直接上代码:

1:多线程处理线性队列

  1. public static void processLineTask(final List<Object> list, int threadCount){
  2. //确保线程数量不大于队列长度
  3. threadCount = Math.min(threadCount, list.size());
  4. for(int i = 0;i < threadCount;i++){
  5. new Thread(){
  6. public void run(){
  7. while(true){
  8. Object o;
  9. //提取队列元素的时候,需要锁住队列
  10. synchronized(list){
  11. //当队列长度为0的时候,线程逐个结束
  12. if(list.size() == 0){
  13. break;
  14. }
  15. o = list.remove(0);
  16. }
  17. //这里可以写一些对元素o的操作
  18. //……
  19. }
  20. }
  21. }.start();
  22. }
  23. }

2:多线程处理环状队列

  1. public static void processCircleTask(final List<Object> list, int threadCount){
  2. //确保线程数量不大于队列长度
  3. threadCount = Math.min(threadCount, list.size());
  4. for(int i = 0;i < threadCount;i++){
  5. new Thread(){
  6. public void run(){
  7. while(true){
  8. Object o;
  9. //提取队列元素的时候,需要锁住队列
  10. synchronized(list){
  11. o = list.remove(0);
  12. }
  13. //这里可以写一些对元素o的操作
  14. //……
  15. //为防止小环导致循环过快,可以给每个o添加时间属性,如果间隔过小就在此sleep
  16. //把元素放到队列尾部
  17. synchronized(list){
  18. list.add(o);
  19. }
  20. }
  21. }
  22. }.start();
  23. }
  24. }

3:多线程处理二维数组,单线处理

  1. public static void processMultiListTask1(final List<List<Object>> list, int threadCount){
  2. //确保线程数量不大于队列长度
  3. threadCount = Math.min(threadCount, list.size());
  4. for(int i = 0;i < threadCount;i++){
  5. new Thread(){
  6. public void run(){
  7. while(true){
  8. List<Object> listSub;
  9. //提取值,需要锁住对象
  10. synchronized(list){
  11. if(list.size() == 0){
  12. break;
  13. }
  14. listSub = list.remove(0);
  15. }
  16. Object o;
  17. for(int i = 0;i < listSub.size();i++){
  18. o = listSub.get(i);
  19. //这里可以写一些对元素o的操作
  20. //……
  21. }
  22. }
  23. }
  24. }.start();
  25. }
  26. }

4:多线程处理二维数组,交叉处理

  1. public static void processMultiListTask2(final List<List<Object>> list, int threadCount){
  2. //确保线程数量不大于队列长度
  3. threadCount = Math.min(threadCount, list.size());
  4. for(int i = 0;i < threadCount;i++){
  5. new Thread(){
  6. public void run(){
  7. while(true){
  8. Object o;
  9. //提取值,需要锁住对象
  10. synchronized(list){
  11. if(list.size() == 0){
  12. break;
  13. }
  14. if(list.get(0).size() == 0){
  15. list.remove(0);
  16. }
  17. o = list.get(0).remove(0);
  18. }
  19. //这里可以写一些对元素o的操作
  20. //……
  21. }
  22. }
  23. }.start();
  24. }
  25. }

Java多线程处理任务(摘抄)的更多相关文章

  1. Java多线程处理List数据

    实例1: 解决问题:如何让n个线程顺序遍历含有n个元素的List集合 import java.util.ArrayList; import java.util.List; import org.apa ...

  2. java多线程处理任务

    最近用到使用多线程处理给用户发送站内消息的问题,想到使用java自带的线程池进行处理这个问题,具体如下: 定义一个线程: package com.qlwb.util; import org.apach ...

  3. Java面试宝典摘抄

    1,ClassLoader知识 加载流程:当运行一个程序时,JVM启动,运行bootstrap classloader,该classloader加载Java核心API(此时ExtClassLoader ...

  4. java多线程处理

    package com.copyFile; import java.io.BufferedReader;import java.io.File;import java.io.FileReader;im ...

  5. Java 多线程处理[全]

    http://blog.csdn.net/ghsau/article/details/7421217 Java线程(一):线程安全与不安全 http://blog.csdn.net/ghsau/art ...

  6. Java注解知识点摘抄

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  7. java 内部类(摘抄自网络)

    Java内部类 1.内部类分为成员内部类.静态嵌套类.方法内部类.匿名内部类. 几种内部类的共性: A.内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件,但是前面冠以外部类 ...

  8. Java多线程处理某个线程超时的问题

    ExecutorService exec = Executors.newFixedThreadPool(4); List<Future<Integer>> futures = ...

  9. java多线程处理导入数据拆分List集合 同步处理插入数据

    原文:https://www.2cto.com/kf/201612/581174.html import org.apache.log4j.Logger; import org.apache.poi. ...

随机推荐

  1. 2019.9.30极限测试 04.JAVA语言课堂测试试卷-极限测试

    题目存储在上传的文件当中. 代码实现 Subway 类: package ClassroomTest; public class Subway { private String railway; pr ...

  2. pinpoint 单机HBASE数据量过大问题解决

    Pinpoint接入业务监控后数据量大涨,平均每周Hbase数据增量35G左右,数据量太大,需要对数据进行定期清理,否则监控可用性降低. 操作步骤 查找出数据大的hbase表 [root@iZ28ov ...

  3. java实现接口导出csv文件

    Tomxin7 Simple, Interesting | 简单,有趣 业务介绍 项目要求从数据库中查询出相关数据后,通过表格展示给用户,如果用户需要,可以点击导出按钮,导出数据为csv格式. 开发环 ...

  4. PROOF|ADOBE READER

    样稿PROOF,最后是印刷样张. 修改校样是最后一次修改错误. 每一版editor不一样,任务不同. 不能修改工作单位,但是可以加一个标注. 最好使用ADOBE READER中的COMMENT& ...

  5. PCB上LED指示灯电流、电压总结

    一般指示灯正常发光的电流在10~20mA,低电流LED灯的工作电流在2mA一下,亮度和普通的一样. 压降                    电流 红色         1.82~1.88V     ...

  6. 用Emoji和照片挑战大众点评,YOBO玩转新点评方式能引领潮流吗?

    对于一家企业来说,要想获得长久生命力的必备元素是什么?是技术底蕴和海量资金?但诺基亚.摩托罗拉和黑莓等巨头的崩塌,已经证明再稳固的基础都有可能只是沙子做的.是让人工智能.云计算.大数据等前沿技术赋能于 ...

  7. ubuntu下安装ant

    背景介绍 最近终于正式开始填补一下自己在web方面的知识漏洞. 而ant则是必不可少的东西了,要问ant的作用是什么,简单的说,这个软件可以用最简单的方法将你的web应用程序部署到服务器上,是不是很强 ...

  8. Django2.0——请求与响应(下)

    上篇讲完了请求,这篇接着讲下响应,django响应类型大致有以下几种 HttpResponse:返回简单的字符串 render:渲染模板 redirect:重定向 JsonResponse:返回jso ...

  9. openv uMat和Mat数据格式的转换

    Mat 转成 UMat: UMat umat; mat.copyTo(umat); UMat转成 Mat : Mat mat; umat.copyTo(mat);

  10. luogu P3835 【模板】可持久化平衡树

    #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> usin ...