在Java

时间:2016-01-14 11:21:43

标签: java timer executors

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

1 个答案:

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

取消任务即可