您的位置:首页 > 其它

ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较

2014-11-18 00:00 761 查看
摘要: ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

/**
* <pre>
*
* @author tangxiaodong
* 创建日期: 2014年11月18日
* </pre>
*/
public class TaskTest {

/**
* @param args
* @throws ExecutionException
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("testNoThreadTask begin ...");
testNoThreadTask();

FdfcUtil.sleep(1);

System.out.println("testThreadTask begin ...");
testThreadTask();
}

private static void testNoThreadTask() {
long t1 = System.currentTimeMillis();
for (int k = 0; k < 10; k++) {
// 这是一个耗时的工作
FdfcUtil.sleep((k + 1) * 500);
System.out.println(" k=" + k);
System.out.println("k=" + k + " success");
}
System.out.println(" times :");
System.out.println(System.currentTimeMillis() - t1);
}

private static void testThreadTask(){

// TODO Auto-generated method stub
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(4);
executor.setKeepAliveSeconds(120);
executor.setQueueCapacity(32);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();

List<Future<String>> taskResults = new ArrayList<Future<String>>();
long t1 = System.currentTimeMillis();
for(int k=0; k<10; k++){
taskResults.add(process(executor, k));
}
System.out.println("task doing ...");
while (true) {
boolean isAllDone = true;
for (Future<String> taskResult : taskResults) {
isAllDone &= ( taskResult.isDone() || taskResult.isCancelled() );
}
if (isAllDone) {
// 任务都执行完毕,跳出循环
break;
}
try {
System.out.println("waiting and sleep 1000 ...");
TimeUnit.MILLISECONDS.sleep(1000);
} catch (Exception e) {
System.out.println(e.toString());
break;
}
}

for(Future<String> taskResult : taskResults){
String ex;
try {
ex = taskResult.get();
} catch (Exception e) {
ex = ExceptionUtils.getFullStackTrace(e);
}
if(StringUtils.isNotEmpty(ex)){
System.out.println(ex);
}
}
System.out.println(" times :");
System.out.println(System.currentTimeMillis()-t1);
}

private static Future<String> process(final ThreadPoolTaskExecutor executor , final int k) {
return executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
try {
FdfcUtil.sleep((k+1)*500);
System.out.println(" k=" + k);
} catch (Exception e) {
return ExceptionUtils.getFullStackTrace(e);
}
return "k=" + k + " success";
}
});
}
}

testNoThreadTask 耗时:

times : 27996 ms

testThreadTask 耗时:

times : 15239 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐