ScheduledThreadPoolExecutor取消任务时并删除
public static void main(String[] args) throws InterruptedException {
ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(2);
//如果为true,则 任务取消的时候 会从队列中把这个任务删除,默认是false
//在默认的情况下,如果直接取消,并不会删除队列中的任务,反而会造成内在泄露
executor.setRemoveOnCancelPolicy(true);
ScheduledFuture<?> task = executor.scheduleAtFixedRate(() -> {
System.out.println(Thread.currentThread().getName() + " running...");
}, 0, 500, TimeUnit.MILLISECONDS);
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
int size = executor.getQueue().size();
System.out.println(Thread.currentThread().getName() + " queue size:" + size);
}
}
}, "monitor-thread").start();
TimeUnit.SECONDS.sleep(4);
task.cancel(true);
System.out.println(Thread.currentThread().getName() + " cancel the task..");
}
结果
pool-1-thread-1 running...
pool-1-thread-1 running...
monitor-thread queue size:1
pool-1-thread-1 running...
pool-1-thread-1 running...
monitor-thread queue size:1
pool-1-thread-1 running...
pool-1-thread-1 running...
monitor-thread queue size:1
pool-1-thread-1 running...
pool-1-thread-1 running...
main cancel the task..
monitor-thread queue size:0
monitor-thread queue size:0