Executerservice在超时后提交任务调用代码

时间:2016-12-12 04:20:43

标签: executorservice

我有以下代码,doTransaction方法在20秒后被调用,任何人都可以告诉我为什么花了这么长时间来调用doTransaction方法。 它的发生并非总是很少发生。对此有任何帮助表示赞赏。 谢谢,

        ExecutorService service =  Executors.newSingleThreadExecutor();          

    TransactionTask task = new TransactionTask(object);
    Future<Result> future = service.submit(task);
    Result r = future.get(20000, TimeUnit.MILLISECONDS);


    class TransactionTask implements Callable<Result> {
        private Request req = null;
            public TransactionTask(Request trx){
            this.req = trx;
        }
    @Override
    public Result call() throws Exception  {
        Result o = doTransaction(req);  

        return o;

    }
    }

1 个答案:

答案 0 :(得分:0)

如果您提交多个任务,可以解释上述行为。

您创建的ExecutorService是单线程的,因此它只能同时执行一个任务。如果提交的其他任务将在队列中,并且如果前任务为terminated/completed

,则将开始执行

它仅在20秒后执行,因为在future.get(20000, TimeUnit.MILLISECONDS);中您取​​消了已在运行的任务。你可以检查一下你没有得到CancellationException

修改 由于您使用的是执行中并发的Tomcat,我建议您使用多线程而不是单线程(如果没有必要): - Executors.newFixedThreadPool(N);用于同时执行N个任务并增加时间