Это может быть возможно с использованием простой 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()
, который (должен) возобновит вычисления с контрольной точки.