当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

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

发表于: 2014-05-26   作者:alleni123   来源:转载   浏览次数:
摘要: [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.E
[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

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
看了Thinking in java上的多线程后颇有感触,著文记之。在这里我假设各位都已经拥有了awt和applet的
题: 做一个简单的网络控制软件,分为Server端和Client端,Server段填入一个有效的端口然后监听,Cl
把遇到过的对.Net线程的一些问题和误解集中起来和大家分享,也希望大家能一起补充,热烈欢迎讨论 目录
转自: http://blog.csdn.net/balance156/article/details/15372831 一、netlink简介 netlink协议是
在经过新一轮分工讨论后,我们将我们最初的分工做了一次更新。截图于此。但是同样,基于敏捷开发的
在英语中,“Siege”意为围攻、包围。同时Siege也是一款使用纯C语言编写的开源WEB压测工具,适合在G
通过创建两个线程来实现对一个数的递加。 或许这个实例没有实际运用的价值,但是稍微改动一下,我们
http://blog.csdn.net/chen825919148/article/details/7904219 //这是2个线程模拟卖火车票的小程序
http://kakajw.iteye.com/blog/920839 前言:Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而
今天开始学习java中的多线程,在看书的过程中写了一个实例来练习多线程的用法,下面把代码放到博文
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号