多线程处理list



  1 package test;
  2
  3 import java.util.LinkedList;
  4 import java.util.List;
  5 import java.util.concurrent.CountDownLatch;
  6
  7 public class ThreadTest {
  8
  9     /**
 10      * 多线程处理list
 11      *
 12      * @param data
 13      *            数据LinkedList,线程安全
 14      * @param threadNum
 15      *            线程数
 16      * @throws InterruptedException
 17      */
 18     public synchronized void handleList(LinkedList<String> data, int threadNum) throws InterruptedException {
 19         int length = data.size();
 20         int tl = length % threadNum == 0 ? length / threadNum : (length / threadNum + 1);
 21         CountDownLatch latch = new CountDownLatch(100);// 多少协作
 22         long a = System.currentTimeMillis();
 23         for (int i = 0; i < threadNum; i++) {
 24             int end = (i + 1) * tl;
 25             if ((i * tl) <= length) {
 26                 // 继承thread启动线程
 27                 // HandleThread thread = new HandleThread("线程[" + (i + 1) +"] ",data, i * tl, end > length ? length : end, latch);
 28                 // thread.start();
 29
 30                 // 实现Runnable启动线程
 31                 RunnableThread thread = new RunnableThread("线程[" + (i + 1) + "] ", data, i * tl, end > length ? length : end, latch);
 32                 Thread runable = new Thread(thread);
 33                 runable.start();
 34             }
 35         }
 36         latch.await();// 等待所有工人完成工作
 37         System.out.println("结束*****************************");
 38         long b = System.currentTimeMillis();
 39         System.out.println("时间:" + (b - a) + "毫秒***********************");
 40     }
 41
 42     // 继承Thread
 43     class HandleThread extends Thread {
 44         private String threadName;
 45         private List<String> data;
 46         private int start;
 47         private int end;
 48         private CountDownLatch latch;
 49
 50         public HandleThread(String threadName, List<String> data, int start, int end, CountDownLatch latch) {
 51             this.threadName = threadName;
 52             this.data = data;
 53             this.start = start;
 54             this.end = end;
 55             this.latch = latch;
 56         }
 57
 58         public void run() {
 59             // TODO 这里处理数据
 60             List<String> l = data.subList(start, end);
 61             System.out.println(threadName + "--" + data.size() + "--" + start + "--" + end + "--");
 62             for (int i = 0; i < l.size(); i++) {
 63                 // 单个线程中的数据
 64                 System.out.println(l.get(i));
 65             }
 66             latch.countDown();// 工人完成工作,计数器减一
 67         }
 68     }
 69
 70     // 实现Runnable
 71     class RunnableThread implements Runnable {
 72         private String threadName;
 73         private List<String> data;
 74         private int start;
 75         private int end;
 76         private CountDownLatch latch;
 77
 78         public RunnableThread(String threadName, List<String> data, int start, int end, CountDownLatch latch) {
 79             this.threadName = threadName;
 80             this.data = data;
 81             this.start = start;
 82             this.end = end;
 83             this.latch = latch;
 84         }
 85
 86         public void run() {
 87             // TODO 这里处理数据
 88             List<String> l = data.subList(start, end);
 89             System.out.println(threadName + "--" + data.size() + "--" + start + "--" + end + "--");
 90             for (int i = 0; i < l.size(); i++) {
 91                 // 单个线程中的数据
 92                 System.out.println(l.get(i));
 93             }
 94             latch.countDown();// 工人完成工作,计数器减一
 95         }
 96     }
 97
 98     public static void main(String[] args) throws InterruptedException {
 99         ThreadTest test = new ThreadTest();
100
101         // 准备数据
102         LinkedList<String> data = new LinkedList<String>();
103         for (int i = 0; i < 100; i++) {
104             data.add("item" + "  " + i);
105         }
106         test.handleList(data, 100);
107         // System.out.println(ArrayUtils.toString(data));
108
109     }
110 }

  

时间: 2024-07-29 11:14:03

多线程处理list的相关文章

C# 多线程处理相关说明: WaitHandle,waitCallback, ThreadPool.QueueUserWorkItem

class TestThread { static void Main() { //使用WaitHandle静态方法阻止一个线程,直到一个或多个同步对象接收到信号 WaitHandle[] waitHandles = new WaitHandle[] { new ManualResetEvent(false), new ManualResetEvent(false) }; WaitCallback waitCallback = new WaitCallback(MyThreadWork); Wa

实例演示ThreadLocal和Synchronized针对多线程处理

概述 在java2后,提供了threadlocal.这样一个新的工具类在处理多线程时提供了另外一种与之前不同的解决方案,而且对于开发者来说更加的简洁.它为每个访问这个变量的线程提供一个线程副本,并将这个副本存入到map中.这样就相当于每个线程都拥有自己独立的变量,在多线程并发操作时就不会造成操作数据的不一致.而在单例模式中,使用到的synchronized.它的机制是控制变量只有单线程进行访问,这样对于变量每次只有一个线程来操作句柄就不会操作数据的不一致. ThreadLocal类 Thread

.NET中多线程处理

相信大家在.NET中处理大量数据的时候,不可避免的会用到线程. 那么线程的几个方法,大家应该都知道: 定义四个线程 ReceiveThread = new Thread(new ThreadStart(ReceiveFunc)); SaveThread = new Thread(new ThreadStart(SaveFunc)); SendThread = new Thread(new ThreadStart(SendFunc)); DataThread = new Thread(new Th

在UI线程之外,多线程处理Bitmaps

多线程处理Bitmaps 上一篇,我们讨论了:Android有效的处理Bitmap,降低内存 ,可是最好不要运行在主线程(UI线程),假设图片是本地的或者网络的又或者是其它地方的. 图片载入的时间和很多因素有关(比方从网络或本地读取速度,图片的大小.CPU的能力),假设这些任务堵塞了UI线程,系统有可能会回收并关闭它(see Designing for Responsiveness for more information). 这篇我们将讨论怎样在UI线程之外后台使用异步任务(AsyncTask

[02]WPF异步响应,自定义事件、委托——多线程处理

题记 在编写有GUI的程序时,会遇到这样一种情形:用户点击了一个按钮,程序处理这个事件,然而这个处理过程耗时间较长.我们不想让软件卡在这里,而是让用户可以继续使用其他的软件功能.这种问题可以用多线程的事件响应来解决.这里,我就WPF的多线程事件响应做一个简单的归纳. 一.简单的异步的事件响应 在WPF中,针对简单的多线程处理过程,我们可以使用.NET自带的BackgroundWork完成.BackgroundWork的处理过程就是异步的,不会让用户界面停止响应. using System.Com

多线程处理大量文件

上周做了一个多线程处理大量文件的功能 一是记录 二是分享 三是请博友指出不足 更多的了解多线程. 1.任务:将大量(大约5G)一目录下有日期规则命名的html文件按照年月日三个层次目录存放,目的是为了提高文件检索效率. 2.具体实现:开启10个线程 将文件拷贝到目标文件夹:不符合要求的文件拷贝到别处:记录错误信息和不符合要求的信息:循环判断状态 执行完毕给出提示. 3.开始设想和后来出现问题: 开了10个线程 处理所有文件,如果一文件已在目标文件下存在 则不处理,但是线程间几乎是同时进行的 这样

java多线程处理任务

最近用到使用多线程处理给用户发送站内消息的问题,想到使用java自带的线程池进行处理这个问题,具体如下: 定义一个线程: package com.qlwb.util; import org.apache.log4j.Logger; import redis.clients.jedis.ShardedJedis; import com.qlwb.common.redispool.BusinessRedisParam; import com.qlwb.common.redispool.Busines

0703 socket服务器多线程处理客户请求

1 /************************************************************************* 2 > File Name: my_socket.h 3 > Author:Monica 4 > Mail:[email protected] 5 > Created Time: Thu 03 Jul 2014 10:40:54 AM CST 6 ******************************************

HTML5学习之WebWork多线程处理(八)

多线程技术在服务端技术中已经发展的很成熟了,而在Web端的应用中却一直是鸡肋 在新的标准中,提供的新的WebWork API,让前端的异步工作变得异常简单. 使用:创建一个Worker对象,指向一个js文件,然后通过Worker对象往js文件发送消息,js文件内部的处理逻辑,处理完毕后,再发送消息回到当前页面,纯异步方式,不影响当前主页面渲染. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">