gpt4 book ai didi

java - 如何将任务放回到ThreadPoolExecutor的BlockingQueue中?

转载 作者:行者123 更新时间:2023-11-30 01:49:05 26 4
gpt4 key购买 nike

我正在开发一项可以同时解析大文件的服务。我想使用 ThreadPoolExecutor 来实现我的目的,但问题是,默认情况下,如果所有线程都忙,则 ThreadPoolExecutor 会将传入任务保留在 BlockingQueue 中。

想象一下当我们有 10 个文件,每个文件 10gb 和 5 个线程来执行 10 个文件解析任务时的情况,我想要每个线程:

  1. 从队列中获取任务。
  2. 执行一定量的工作(处理 1GB 的孔文件)。
  3. 暂停任务并放回队列。
  4. 执行另一个任务并重复,直到处理完所有文件。

最佳答案

也许可以使用纯 Java 来完成,但这取决于任务是否可以检查点本身。这是一个草图:

Executor ex = ...

public class MyTask implements Runnable {
private int next; // The state of the computation
private int end; //

public MyTask(int start, int end) {
this.next = start;
this.end = end;

public void run() {
for (int i = next; i < end; i++) {
// do stuff
if (/* suspend task *) {
this.next = i + 1; // checkpoint task state
executor.execute(this); // requeue this task
return; // release worker thread
}
}
System.out.println("Finished task");
}
}

for (...) {
executor.execute(new MyTask(...));
}

请注意,暂停任务包括在 this 字段中记录计算的当前状态,将 this 添加到队列中,然后返回以释放工作线程线。当挂起的任务再次到达队列头部时,执行器会将其分配给工作线程,该线程将调用 run() ,这将(必须)从检查点恢复计算。

关于java - 如何将任务放回到ThreadPoolExecutor的BlockingQueue中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56771551/

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