gpt4 book ai didi

java - 想让ThreadPoolExecutor立即执行任务

转载 作者:行者123 更新时间:2023-11-30 03:50:42 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com