[英]Waiting in main Thread till a canceled Executor Task is finished
我有一個ScheduledExecutorService(帶有newScheduledThreadPool(1)),我在其中添加了以下任務:
myTask = scheduler.scheduleAtFixedRate(new Runnable() {
@Override public void run() {
// do work
}
},
delay,
interval,
TimeUnit.MILLISECONDS );
我有所有任務的清單。 例如,如果我想刪除任務,則可以執行此操作(例如第一個任務)
myTaskList.get(0).getTask().cancel(true);
我現在的問題是,如果我要取消的任務當前正在調度程序線程中運行,則我必須在主線程中等待,直到任務被取消。 我以為我可以用get()這樣來做到這一點:
myTaskList.get(0).getTask().cancel(true);
myTaskList.get(0).getTask().get();
但是我的主線程繼續運行而沒有等待任務代碼完成。
為了清楚起見,我想要的基本上是這樣的:
用戶想取消任務
如果要取消,任務是調度程序線程中當前正在運行的任務,則主線程必須等待,直到任務不再是調度程序線程中正在執行的任務為止
如果我真正理解您的意思,則希望main方法等待子線程完成/停止。 是真的嗎 如果是這樣,則可以在main方法中使用join()方法。 此方法強制main方法等待子線程停止/結束。 此方法在類java.lang.Thread中。
我認為這在實踐中不可行。 當您嘗試對取消的Future進行get()
時,它將根據API拋出CancellationException
@throws CancellationException - if the computation was cancelled
您可以嘗試使用CountdownLatch映射Future,也許像這樣
class LatchedFuture{
volatile Future future;
final CountdownLatch latch = new CountdownLatch(1);
}
final LatchedFuture latchedFuture = new LatchedFuture();
latchedFuture.future = scheduler.scheduleAtFixedRate(new Runnable() {
@Override public void run() {
// do work
latchedFuture.latch.countDown();
}
},
delay,
interval,
TimeUnit.MILLISECONDS );
然后,當您希望完成時。
myTaskList.get(0).getTask().future.cancel(true);
myTaskList.get(0).getTask().latch.await();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.