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

[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可能会无法包含到最终的数据。
而上面的代码修复了这个问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值