我正在研究java中的套接字编程。我必须在每个连接中使用timer,并且我使用的是定时器,如下面的代码:
this.timeoutTask = new TimeoutTask();
this.timeoutTimer = Executors.newSingleThreadScheduledExecutor();
private void startTimer(ConnectionState state) {
int period;
connectionState = state;
period = connectionState.getTimeoutValue();
future = timeoutTimer.scheduleAtFixedRate(timeoutTask, period, period, TimeUnit.MILLISECONDS);
}
private void stopTimer() {
if (timeoutTimer != null) {
future.cancel(true);
}
}
private void shutdownTimer() {
timeoutTimer.shutdown();
timeoutTask.cancel();
}
我正在使用'stopTimer'函数来暂停计时器和'shutdownTimer'函数来删除计时器任务。 但是当这样使用计时器时,有时会运行数千个计时器线程因为数千个时间同时存在。 防止此问题的最佳方法是什么?
答案 0 :(得分:0)
您应该使用线程池:
而不是为每个任务创建线程this.timeoutTask = new TimeoutTask();
static ScheduledExecutorService timeoutTimer = Executors.newScheduledThreadPool(10);
private void startTimer(ConnectionState state) {
int period;
connectionState = state;
period = connectionState.getTimeoutValue();
future = timeoutTimer.scheduleAtFixedRate(timeoutTask, period, period, TimeUnit.MILLISECONDS);
}
private void stopTimer() {
future.cancel(true);
}
现在任务将从线程池中的自由线程中执行。
您无需停止ExecutorService
,只需使用future.cancel(true);