ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
2014-11-18 00:00
761 查看
摘要: ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
testNoThreadTask 耗时:
times : 27996 ms
testThreadTask 耗时:
times : 15239 ms
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 多线程分解执行耗时任务与单线程串行执行简单比较
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- 使用Spring ThreadPoolTaskExecutor实现多线程任务
- C# 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕
- ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东
- 使用SPRING中的线程池ThreadPoolTaskExecutor并且得到任务执行的结果
- 使用Spring ThreadPoolTaskExecutor实现多线程任务
- Spring中ThreadPoolTaskExecutor的线程调度及问题
- ThreadPoolTaskExecutor线程使用,及线程池配置
- Hadoop MapReduce之ReduceTask任务执行(二):GetMapEventsThread线程
- GCD的简单使用,开辟一条新的线程,让上面的任务串行执行
- 你知道的,javascript语言的执行环境是"单线程模式",这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行,因此很多时候需要进行“异步模式”,请列举js异步编程的方法。
- spring ThreadPoolTaskExecutor的线程池类实现多线程
- .NET异步多线程,Thread,ThreadPool,Task,Parallel,异常处理,线程取消
- 通过线程池使用多线程并发:ThreadPoolTaskExecutor 的应用例子
- Thread Runnable建立新线程 Handler AsycTask执行异步任务(不一定建立新的线程)
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- Java多线程——<三>简单的线程执行:Executor
- android.view.ViewRootImpl$CalledFromWrongThreadException:Android2.3后耗时线程不可以在UI线程中执行