首页 > 代码库 > ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较

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

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