1

我正在使用 java 中的套接字编程。我必须在每个连接中使用计时器,并且我正在使用类似以下代码的计时器:

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”函数来删除定时器任务。但是当像这样使用定时器时,有时会运行数千个定时器线程,因为数千个时间同时存在。防止此问题的最佳方法是什么?

4

1 回答 1

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);

于 2016-01-14T12:28:26.317 回答