在主线程中等待,直到取消的执行任务完成

时间:2012-02-20 16:00:45

标签: java multithreading

我有一个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();

但是我的主线程继续而没有等待任务代码完成。

为清楚起见,我想要的基本上是这样的:

  • 用户想要取消任务

  • 如果要取消任务是当前在调度程序线程中运行的任务,主线程必须等到任务不再是在调度程序线程中执行的任务

2 个答案:

答案 0 :(得分:-1)

如果我真正了解你的意思,你希望main方法等待子线程完成/停止。这是真的吗?如果是这样,您可以在main方法中使用方法join()。此方法强制main方法等待子线程停止/完成。此方法在类java.lang.Thread。

答案 1 :(得分:-1)

我认为这不会在实践中发挥作用。当您在取消的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();