簡體   English   中英

在主線程中等待,直到取消的執行器任務完成

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM