博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
阅读量:7022 次
发布时间:2019-06-28

本文共 3417 字,大约阅读时间需要 11 分钟。

  hot3.png

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;/** * 
 * * @author tangxiaodong * 创建日期: 2014年11月18日 * 
 */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
> taskResults = new ArrayList
>();        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
 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
 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
 process(final ThreadPoolTaskExecutor executor , final int k) {        return executor.submit(new Callable
() {            @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

转载于:https://my.oschina.net/hotkit/blog/345839

你可能感兴趣的文章
设计中的道理_6
查看>>
MFC——AfxParseURL用法
查看>>
Cocos2d-x3.2 Sprite精灵类的创建与设置
查看>>
Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
查看>>
深入浅出PostgreSQL B-Tree索引结构
查看>>
PostgreSQL 如何高效解决 按任意字段分词检索的问题 - case 1
查看>>
玩转PS路径,轻松画logo!
查看>>
浅析 JavaScript 中的闭包(Closures)
查看>>
python 之 PEP8 风格
查看>>
Python Pandas concat 的使用
查看>>
RHEL 网络的简单配置
查看>>
新机开源经历
查看>>
(Mac)VMware Fusion 安装centos ,mac访问不了centos里的web服务器解决方案
查看>>
GuozhongCrawler系列教程 (4) StartContext详解
查看>>
shell脚本案例
查看>>
Web语义化
查看>>
[case分享]Exchange 2013 IMAP问题解决历程
查看>>
nginx安装
查看>>
如何开启MySQL的远程帐号
查看>>
Linux下安装Oracle10g详细教程
查看>>