如果您的课程B
将保留下来,并且 每个实例 最终 都 将被关闭或关闭或释放,那么我将这样做:
class B {
final scheduledexecutorservice scheduler = Executors.newScheduledThreadPool(1);
public boolean execute() {
try {
scheduler.scheduleWithFixedDelay(new BRunnnableTask(), period, delay);
return true;
} catch (Exception e) {
return false;
}
}
public void close() {
scheduler.shutdownNow();
}
}
如果您不会在每个实例上进行这种清理,那么我会这样做:
class B {
static final scheduledexecutorservice SCHEDULER = Executors.newCachedThreadPool();
public boolean execute() {
try {
SCHEDULER.scheduleWithFixedDelay(new BRunnnableTask(), period, delay);
return true;
} catch (Exception e) {
return false;
}
}
}
ExecutorService
您在代码中分配的每个分配都会分配一个Thread
。如果您制作了很多类实例,B
则每个实例都会分配一个Thread
。如果这些不能迅速收集到垃圾,那么您可能最终会分配成千上万个线程(但未使用,只是分配了),并且可能使整个服务器崩溃,使机器上的每个进程都挨饿,而不仅仅是您自己的JVM。我已经看到它在Windows上发生,并且我希望它也可以在其他OS上发生。
当您不打算在单个对象实例上使用生命周期方法时,静态缓存线程池通常是一种安全的解决方案,因为您只会保留实际 运行的 线程数,而不会为创建的每个实例分配一个线程尚未收集垃圾。