`

[转]多线程任务分配实例

阅读更多
[url]http://www.iteye.com/problems/100706
[/url]
package com.lj.thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class BasicTest
{
	
	public static void main(String[] args) throws InterruptedException, ExecutionException
	{
		List<String>list=new ArrayList<String>();
		
		for(int i=0;i<100;i++){
			list.add(i+",");
		}
		
		System.out.println(new BasicTest().list2Str(list, 5));
	}
	
	
	public String list2Str(List<String>list,final int nThreads) throws InterruptedException, ExecutionException{
		if(list==null||list.isEmpty()){
			return null;
			
		}
		
		
		StringBuffer ret=new StringBuffer();
		
		int size=list.size();
		
		ExecutorService executorService=Executors.newFixedThreadPool(nThreads);
		
		List<Future<String>> futures=new ArrayList<Future<String>>();
		
		for(int i=0;i<nThreads;i++){
			final List<String> subList=list.subList(size/nThreads*i, size/nThreads*(i+1));
			Callable<String>task=new Callable<String>(){

				@Override
				public String call() throws Exception
				{
					StringBuffer sb=new StringBuffer();
					for(String str:subList){
						sb.append(str);
					}
					
					return sb.toString();
				}
				
			};
			
			futures.add(executorService.submit(task));
		}
		
		
		for(Future<String>future:futures){
			System.out.println("Future<String>future:futures");
			ret.append(future.get());
		}
		
		executorService.shutdown();
		
		return ret.toString();
		
	}
}

这里Future<String>里的String就是返回类型。

可以改成任意其他类型如Future<List<Object>>






================================================

2014-07-21 更新:


package com.lj.socket;

import java.util.ArrayList;
import java.util.List;

public class Test02
{
	public static void main(String[] args)
	{
		List<String> all = new ArrayList<String>();
		all.add("h");
		all.add("w");
		all.add("c");
		all.add("2");
		all.add("x");

		int nthread = 2;

		System.out.println(all.size());
		int size = all.size();
 

		for (int i = 0; i < nthread; i++)
		{
			System.out.println(i);
			if (i + 1 == nthread)
			{
				System.out.println("hello");
				List<String> lastSub=all.subList(size/nthread*i, all.size());
				System.out.println("lastSub="+lastSub);
			} else
			{
				List<String> sub = all.subList(size / nthread * i, size / nthread * (i + 1));
				System.out.println("sub=" + sub);
			}
		}

	}
}





这个程序有个问题,就是最后一个sublist可能会无法包含到最终的数据。
而上面的代码修复了这个问题。
分享到:
评论

相关推荐

    Delphi线程池实现多线程FTP分段下载组件

    Delphi线程池实现多线程FTP分段下载组件 by :renshouren mail:114032666@qq.com QQ:114032666 2019.10.05 使用的组件 1、TIdFTP Indy FTP客户端 2、TThreadsPool 线程池 工作原理及流程 调用本单元,将自动在程序...

    基于PHP pthreads实现多线程代码实例

    在某些情况,我们要使用 PHP 进行重复的任务,但是只能完成单次,叠加起来的话执行时间会非常长,所以就要将任务分配到多个线程来分别执行。 但 PHP 在默认情况下是没有多线程的,必须要使用 pthreads PHP 扩展,这...

    ado连接池实例

    从TThread派生的多线程实例可以构成Delphi的多线程应用程序。  当一个应用程序运行时,应用程序就被载入内存准备执行。此时,它成为包含一个或多个线程的进程,每个线程含有数据、代码和系统资源。线程执行应用...

    VC多线程编程详解

    本文实例讲述了VC多线程编程概念与技巧,分享给大家供大家参考。具体分析如下: 一、多线程编程要点 线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、...

    易语言鱼刺类模块526

    使用鱼刺多线程,您可以将程序的不同任务分配给多个线程同时执行,从而提高程序的并发性和性能。这对于一些需要同时处理多个任务或需要进行耗时操作的程序非常有用。 鱼刺多线程库提供了一系列的函数和方法,用于...

    Java多线程编程的Java中的线程.docx

    程序、进程和线程 程序是一组指令的有序集合,也可以将其通俗地理解为若干行代码。...一个进程可以包含多个线程,每个线程执行自己的任务,同一个进程中的所有线程共享该进程中的资源,如内存空间、文件句柄等。

    程序、进程、线程的区别

    根本差别:进程是操作系统任务调度和资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。 资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    精通WindowsAPI 函数 接口 编程实例

    12.4 任务栏通知区域(Tray)图标 363 12.4.1 创建图标窗口 364 12.4.2 创建图标和图标菜单 367 12.4.3 最小化主窗口到通知区域 370 12.4.4 弹出气泡通知 372 12.4.5 动态图标 374 12.4.6 其他功能 376 ...

    Visual C++ 6.0编程实例详解.part2

    第9章 多任务和多线程 9.1 多线程概念 9.2 创建与终止线程 9.2.1 AfxBeginThread函数 9.2.2 创建用户界面线程 9.2.3 创建辅助线程 9.2.4 终止线程 9.2.5 线程的优先级 9.3 线程通信 9.3.1 ...

    Visual C++ 6.0编程实例详解.part1

    第9章 多任务和多线程 9.1 多线程概念 9.2 创建与终止线程 9.2.1 AfxBeginThread函数 9.2.2 创建用户界面线程 9.2.3 创建辅助线程 9.2.4 终止线程 9.2.5 线程的优先级 9.3 线程通信 9.3.1 ...

    精通Windows.API-函数、接口、编程实例.pdf

    12.4 任务栏通知区域(Tray)图标 363 12.4.1 创建图标窗口 364 12.4.2 创建图标和图标菜单 367 12.4.3 最小化主窗口到通知区域 370 12.4.4 弹出气泡通知 372 12.4.5 动态图标 374 12.4.6 其他功能 376 ...

    Java并发编程论述 pdf

    为了能够提⾼执⾏的效率,并发的去执⾏多线程的计算任务,提出了CPU时间⽚算 法。CPU为每⼀个线程分配时间⽚,时间⽚⼀般⼏⼗毫秒,当该线程在CPU上执⾏完时间⽚⻓度 时间的计算后,就会被踢出CPU并挂起,该CPU会被...

    【嵌入式软件工程师面经】Linux系统编程(线程进程).pdf

    在多任务操作系统中,多个进程可以同时运行,操作系统的调度器负责管理这些进程的执行,给它们分配CPU时间。进程还可以进行创建(通常称为“fork”)新的进程。 线程(Thread) 线程有时被称为轻量级进程,它是...

    深入理解JavaScript中的并行处理

    前言 为什么说多线程如此重要?这是个值得思考的问题。一直以来,派生线程以一种优雅的...如果你了解其他从一开始就支持多线程的语言的话,你可能会发现很多的限制,远非仅仅是实例化一个新线程,然后你操控这个实例就

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    基于Python的多进程编程

    进程是自愿分配的基本单元,线程是CPU执行和调度的基本单位。进程之间的数据是独立的,同一个进程中的所有线程中的数据是共享的。...多进程编程同时运行了多个任务,并发执行的时间比单进程顺序执行要快。

Global site tag (gtag.js) - Google Analytics