我有一个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();
但是我的主线程继续而没有等待任务代码完成。
为清楚起见,我想要的基本上是这样的:
用户想要取消任务
如果要取消任务是当前在调度程序线程中运行的任务,主线程必须等到任务不再是在调度程序线程中执行的任务
答案 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();