Kes*_*115 5 java multithreading executorservice
public ScheduledFuture<?> executeTaskWithDelay(String name,
final Runnable runnable, Period delay, boolean isDaemon) {
ScheduledExecutorService executorService =
Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory(
name, isDaemon));
ScheduledFuture<?> future = executorService.schedule(runnable,
delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);
executorService.shutdown();
return future;
}
Run Code Online (Sandbox Code Playgroud)
当我分析应用程序时,我注意到这个方法创建的调度线程在执行之前总是处于"正在运行"而不是"等待"状态.如果我删除executorService.shutdown()它会做我想要的(即线程保持等待状态,直到它们运行的时间).但是,如果没有executorService.shutdown(),nonDaemon线程在执行后永远不会被垃圾收集.有没有办法可以确保线程在执行前始终处于等待状态?或者我可以使用其他替代方法来确保:
找到了一个解决方案: shutdown() 将所有待处理任务线程的状态从“等待”更改为“运行”。我现在使用 executorService 来安排对其自己的 shutdown() 的调用,而不是立即调用 shutdown()。这可确保挂起的任务尽可能长时间地保持等待状态,从而节省 CPU 资源。
public ScheduledFuture<?> executeTaskWithDelay(String name,
final Runnable runnable, Period delay, boolean isDaemon) {
final ScheduledExecutorService executorService =
Executors.newSingleThreadScheduledExecutor(new DefaultThreadFactory(
name, isDaemon));
ScheduledFuture<?> future = executorService.schedule(runnable,
delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);
executorService.schedule(new Runnable() {
@Override
public void run() {
executorService.shutdown();
}}, delay.toStandardDuration().getMillis(), TimeUnit.MILLISECONDS);
return future;
}
Run Code Online (Sandbox Code Playgroud)