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

时间: 2024-10-19 22:34:58

ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较的相关文章

spring定时器任务多任务串行执行问题排查

原文:https://www.cnblogs.com/youtianhong/p/6027249.html 最近发现个生产问题,定时器任务某些任务没有及时执行.经过研究排查发现spring 定时器任务scheduled-tasks默认配置是单线程串行执行的,这就造成了若某个任务执行时间过长,其他任务一直在排队,业务逻辑没有及时处理的问题. 如下是scheduled定义了3个任务. <task:scheduled-tasks > <task:scheduled ref="myTa

loadrunner多场景的串行执行以及定时执行

方法一: 既然是脚本串行执行,那在场景设计中必然是要用多个脚本,要注意的是需要将Scenario Schedule中的Schedule by设置为Group的模式.然后按实际需要依次设置每个脚本的Schedule.要事先计算好每个脚本的整个执行时间,方便定义后续脚本的开始时间(设置Start Group). 方法二: 使用定时任务执行: 首先创建并设置好要跑的个测试场景,再创建一个一个批处理程序按先后顺序调用这几个个场景进行测试,最后通过Windows的定时任务设定批处理的执行时间 写一个批处理

关于异步任务串行执行的思考与实现

最近在做的一个需求被产品的各种奇葩要求和各种为了体验的迷之借口搞得面目前非,里面有很多异步请求,而且有时候是独立执行,有时候需要相互依赖的串行执行(A的结果回来了,成功的话执行B,不成功不管).一开始我都是非常简单的在Activity中实现各种回调接口,然后在回调方法中调用下一个异步请求,为了能串行的执行,因此加了很多boolean值标记当前什么状态.然后我就想做一个可以封装异步任务,然后按照顺序异步执行的一个模式. 我希望使用的时候,可以new一个AsyncTask对象,然后它成功的后执行什么

oracle中并行执行不一定比串行执行快

并行执行与串行执行相比,能否缩短执行时间,取决于如下几个方面:1.待执行的目标SQL是否适合并行执行,有些SQL是不太适合并行执行的,比如走索引的嵌套循环连接.2.数据库服务器上的硬件资源(如CPU.内存.I/O等)是否还有富余.3.并行执行时,是否最大化地利用了数据库服务器上的硬件资源(但同时又不能使数据库服务器上的硬件资源消耗殆尽).4.待执行的目标SQL的并行执行计划是否为当前情形下的最优执行计划. 原文地址:https://www.cnblogs.com/qinjf/p/8414654.

背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下载任务(任务分组,并行或串行执行,组完成后通知) 示例演示后台下载任务的分组,以及如何设置组内任务是并行执行还是串行执行,以及组任务全部完成后如何 toast 或 tile 通知)BackgroundTask/TransferModel.cs /* * 扩展了 DownloadOperation 和 UploadOperation,用于 MVVM 绑定数据 */ using System; using S

并行执行、串行执行和并发执行

并发执行是多道程序系统中多个程序(逻辑上互相独立)或者一个程序中的多个程序段在执行的过程当中,时间互相重叠,一个程序执行没结束,另一个已经开始. 并行执行是指一组程序按照独立的,不同步的速度执行,时间上不重叠: 串行就是指令一个一个的执行.并行是指令同时并行执行. 总结: 并发是指多个线程轮流执行(单核CPU): 并行是指多个线程同时执行(多核CPU),微观上是同时的: 串行是指一个一个的执行,处理完一个才能处理下一个,不轮换: 原文地址:https://www.cnblogs.com/feix

并行的执行效率一定高于串行吗?(多线程的执行效率一定高于单线程吗?)

一.什么是串行?什么是并行? 串行:任务进行排队,一个一个执行: 并行:多个任务齐头并进.   二.单核.多核这两种情况下的并行. 单核情况下的并行:并非真的是多个任务同时进行的,是需要在这任务之间来回切换(即上下文切换)的. 多核情况下的并行:是几核,就能真正做到几核同时执行各自的任务. 三.任务的两大类型. “计算密集型”任务: 特点是要进行大量的计算,消耗CPU资源,比如计算圆周率.对视频进行高清解码等等,全靠CPU的运算能力. 这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)

一.同步.异步和串行.并行 任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行. 一个同步函数只在完成了它预定的任务后才返回.一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成.因此,一个异步函数不会阻塞当前线程去执行下一个函数. (来源:http://www.cocoachina.com/industry/20140428/8248.html) 队列分为串行和并行 任务的执行分为同步和异步 -------  队列只是负责任务的调度,而不负责任

在 tornado 中异步无阻塞的执行耗时任务

在 linux 上 tornado 是基于 epoll 的事件驱动框架,在网络事件上是无阻塞的.但是因为 tornado 自身是单线程的,所以如果我们在某一个时刻执行了一个耗时的任务,那么就会阻塞在这里,无法响应其他的任务请求,这个和 tornado 的高性能服务器称号不符,所以我们要想办法把耗时的任务转换为不阻塞主线程,让耗时的任务不影响对其他请求的响应. 在 python 3.2 上,增加了一个并行库 concurrent.futures,这个库提供了更简单的异步执行函数的方法. 如果是在