CompletionServiceを使用していくつかのFutureタスクを送信します。FixedThreadPool ExecutorService 2スレッドをラップして、設定したタスクの数と等しいループを設定し、completionserviceを使用します。それらをすべて完了または失敗させるのを待つtake()。私はtake()メソッドをpoll(300、Timeout.SECONDS)に変更しました.1つのタスクが完了するまでに5分以上かかると考えられます投票は失敗し、最終的にはループから抜け出し、すべての未来を巡ってfuture.cancel(true)を呼び出して問題のタスクを強制的に取り消すことができます。CompletionServiceを使用して長すぎるタスクをキャンセルするには
しかし、コードを実行してハングすると、ポーリングが5分に1回連続して失敗し、それ以上のタスクが実行されないので、2人の作業者が何らかの方法でデッドロックされ、始めること。タイムアウトは5分で、実行するタスクがまだ1000件あったため、ループを解除するには時間がかかりすぎてジョブがキャンセルされました。
私がやりたいことは、5分後にhasntが完了した場合、現在のタスクを中断/強制解除することですが、それを行う方法は何も見えません。
このコードサンプルは、Imはあなたの労働者の例では約
import com.jthink.jaikoz.exception.JaikozException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;
public class CompletionServiceTest
{
public static void main(final String[] args)
{
CompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(Executors.newFixedThreadPool(2));
Collection<Worker> tasks = new ArrayList<Worker>(10);
tasks.add(new Worker(1));
tasks.add(new Worker(2));
tasks.add(new Worker(3));
tasks.add(new Worker(4));
tasks.add(new Worker(5));
tasks.add(new Worker(6));
List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(tasks.size());
try
{
for (Callable task : tasks)
{
futures.add(cs.submit(task));
}
for (int t = 0; t < futures.size(); t++)
{
Future<Boolean> result = cs.poll(10, TimeUnit.SECONDS);
if(result==null)
{
System.out.println("Worker TimedOut:");
continue;
}
else
{
try
{
if(result.isDone() && result.get())
{
System.out.println("Worker Completed:");
}
else
{
System.out.println("Worker Failed");
}
}
catch (ExecutionException ee)
{
ee.printStackTrace();
}
}
}
}
catch (InterruptedException ie)
{
}
finally
{
//Cancel by interrupting any existing tasks currently running in Executor Service
for (Future<Boolean> f : futures)
{
f.cancel(true);
}
}
System.out.println("Done");
}
}
class Worker implements Callable<Boolean>
{
private int number;
public Worker(int number)
{
this.number=number;
}
public Boolean call()
{
if(number==3)
{
try
{
Thread.sleep(50000);
}
catch(InterruptedException tie)
{
}
}
return true;
}
}
出力
Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker Completed:
Worker TimedOut:
Done
@ user294896 - いくつかのサンプルコードを小さな独立した例で提供できますか? – justkt
@justkt少しでも時間がかかるかもしれません –
なぜタスク自体が時間がかかり過ぎて中断してしまうのはなぜですか?これは物事を大幅に簡素化するでしょう。 – trojanfoe