gpt4 book ai didi

java - 带有队列的 SimpleAsyncTaskExecutor

转载 作者:行者123 更新时间:2023-12-02 00:56:54 24 4
gpt4 key购买 nike

我需要同时运行一些线程,但需要强制每个进程在新线程中运行(这是由于我无法完全控制的一些 ThreadLocal 出血)。为此,我一直在使用 SimpleAsyncTaskExecutor。然而,这样做的问题是,它没有维护一个队列,允许在达到并发限制后提交新任务。我真正需要做的是拥有像 SimpleAsyncTaskExecutor 这样的功能,但即使在达到并发限制后仍然可以提交任务 - 我只是希望这些任务在队列中等待,直到另一个插槽空闲。这就是我现在所拥有的:

SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();

taskExecutor.setConcurrencyLimit(maxThreads);

return taskExecutor;

是否有一些开箱即用的解决方案,或者我需要编写一些自定义的东西?

最佳答案

为了确保您需要在新线程中执行每个任务,您基本上反对使用任何ThreadPool(ThreadPool中的ThreadLocal行为是您迟早需要摆脱的东西)。

为了克服这个问题,你可以简单地制作这样的东西,

 class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) {
Thread t = new Thread(r);
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

始终在新线程中执行 Runnable。

对于一个粗略的实现,我们可以做类似的事情

    final Executor executor = new ThreadPerTaskExecutor(); 
final ExecutorService service = Executors.newFixedThreadPool(3);
for (int i = 0; i < 100; i++) {
service.submit(new Runnable() {
public void run() {
try {
System.out.println("Executed inside Thread pool with concurrency level 3"
+ Thread.currentThread().toString());
executor.execute(new Runnable() {
public void run() {
try {
Thread.sleep(3000); //Some expensive operations here.
System.out.println(
"Executed inside new Thread always" + Thread.currentThread().toString());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

在 Java 8 之后也可以使用 lambda 来改进这一点。希望这能摆脱基本思想。

关于java - 带有队列的 SimpleAsyncTaskExecutor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57811175/

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