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
文章展示了如何配置ScheduledThreadPoolExecutor在取消任务时同时从队列中删除,防止内存泄漏。通过设置`setRemoveOnCancelPolicy(true)`,当调用`cancel(true)`时,任务将被从队列中移除。示例代码中,监控线程显示了队列大小的变化,证明了任务在取消后被正确删除。



945

被折叠的 条评论
为什么被折叠?



