2016-01-14 7 views
1

Я работаю над программированием сокетов в java.I должны использовать таймер в каждом соединении, и я использую таймер как следующий код:Что является наиболее рекомендуемым способом с помощью таймера в 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 для удаления задачи таймера. Но при использовании таймера, как это, иногда, запускает тысячи потоков таймера, потому что тысяча раз жива одновременно. Каков наилучший способ предотвратить эту проблему?

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^