任務,我提交使用裹着一個2線FixedThreadPool的ExecutorService一個CompletionService一些未來的某個任務,我設置,則設置等於提交的任務數的循環和使用completionservice。採取()等待他們全部完成或失敗。麻煩很偶然,它永遠不會完成(但我不知道爲什麼),所以我將take()方法更改爲poll(300,Timeout.SECONDS),這個想法是,如果一個任務需要超過5分鐘才能完成民意調查將失敗,然後最終會退出循環,我可以通過所有的未來,並調用future.cancel(true)強制取消違規任務。如何取消所花費的時間太長使用CompletionService
但是,當我運行代碼並掛起時,我發現輪詢每5分鐘連續失敗一次,並且沒有更多任務運行,因此我認爲這兩個工作人員以某種方式死鎖,並且永遠不會結束,並且決不允許執行其他任務開始。因爲超時時間爲5分鐘,並且仍有1000個任務需要運行,所以打破循環的時間太長,因此取消了這項工作。
所以我想要做的就是interupt /力消除當前的任務,如果處理不當在5分鐘內完成,但我看不到任何方式做到這一點。
此代碼示例說明了什麼林談論
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 2011-03-10 14:02:52
@justkt我可以試試,可能需要一點時間 – 2011-03-10 14:05:51
爲什麼這個任務本身不能意識到它需要很長的時間和中止?這將大大簡化事情。 – trojanfoe 2011-03-10 14:10:13