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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。