java - 想让ThreadPoolExecutor立即执行任务

标签 java executorservice threadpoolexecutor

我有一个 ThreadPoolExecutor,其中有一个线程将用于批处理,因此在将新任务分配给执行程序之前,我必须等待较早的任务完成,我是根据 Activity 作业的值来完成此操作的,但是仔细查看我发现,执行器并没有立即执行任务。

这给我带来的问题是,我已经准备好提供下一批任务,但第一个任务尚未开始,因此 Activity 作业的值为 0。

我怎样才能立即运行任务。我也同意任何其他执行者或完成此任务的方式。

最佳答案

您可能应该使用 ExecutorService 中的 submit 方法来安排您的任务。这是一个使用单线程执行器运行 10 个任务的工作程序。我转换为 ThreadPoolExecutor 来监视线程池状态。您可以通过在其相应的 Future 实例上调用 get 来等待单个任务,也可以通过调用 awaitTermination 来等待所有任务。如果您不需要 Future 的结果,只需使用 Void 即可。希望对您有所帮助。

public class Main {                                                                                                                             
    static class TimingCallable implements Callable<Long> {                                                                                     
        static int MIN_WAIT = 200;                                                                                                              
        @Override                                                                                                                               
        public Long call() {                                                                                                                    
            long start = System.currentTimeMillis();                                                                                            
            try {                                                                                                                               
                Thread.sleep(MIN_WAIT + new Random().nextInt(300));                                                                             
            } catch (InterruptedException e) {                                                                                                  
                //DO NOTHING                                                                                                                    
            }                                                                                                                                   
            return System.currentTimeMillis() - start;                                                                                          
        }                                                                                                                                       
    }                                                                                                                                           

    public static void main(String[] args) throws InterruptedException, ExecutionException {                                                    

        ExecutorService executor =  Executors.newFixedThreadPool(1);                                                                            
        @SuppressWarnings("unchecked")                                                                                                          
        Future<Long>[] futureResults = new Future[10];                                                                                          
        for(int i =0; i < futureResults.length; i++) {                                                                                          
            futureResults[i] = executor.submit(new TimingCallable());                                                                           
            System.out.println(String.format("ActiveCount after submitting %d tasks: ", i+1) + ((ThreadPoolExecutor)executor).getActiveCount());
            System.out.println(String.format("Queue size after submitting %d tasks: ", i+1) + ((ThreadPoolExecutor)executor).getQueue().size());
        }                                                                                                                                       
        Thread.sleep(2000);                                                                                                                     
        System.out.println("ActiveCount after 2 seconds: " + ((ThreadPoolExecutor)executor).getActiveCount());                                  
        System.out.println("Queue size after 2 seconds: " + ((ThreadPoolExecutor)executor).getQueue().size());                                  
        for(int i =0; i < futureResults.length; i++) {                                                                                          
            if (futureResults[i].isDone()) {                                                                                                    
                System.out.println(String.format("%d task is done with execution time: ", i) + futureResults[i].get());                         
            }                                                                                                                                   
        }                                                                                                               //Waiting for the last task to finish
        System.out.println("Waiting for the last task result: " + futureResults[9].get());
        executor.shutdown();
        executor.awaitTermination(10, TimeUnit.SECONDS);                                  
    }                                                                                                                                           
}                                                                                                                                               

关于java - 想让ThreadPoolExecutor立即执行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24526675/

相关文章:

java 看不到 CLASSPATH

java - 遍历嵌套的 hashmap

java - 如何通过一个按钮打开和关闭 java gui 窗口的可见性?

java - 当单个程序有多个 `ThreadPoolExecutor` 时会发生什么?

javascript - 如何使用 Java 或 Javascript 程序从 Splunk 导出搜索结果。

java - 如何使用 CompletionService 取消那些花费太长时间的任务

Java 线程 - 等待数据返回,但不阻塞其他线程

python - 如何并行运行多个阻塞 IO 协程

python-3.x - 带有上下文管理器 "cannot schedule new futures after shutdown"的 ThreadPoolExecutor

java - 使用 ExecutorService 在具有通过循环传递的不同参数的类中同时执行方法时出现问题