2015-09-10 3 views
2

Я создаю симулятор, который запускает 1000 (и более) клиентов, в каждом клиенте я хочу запустить задачу после X-времени, я пробовал TimerTask, проблема в том, что в каждой задаче (более 1000) создается новый поток.Запуск таймера без потока в java

Был ли какой-либо таймер задачи без потока?

+0

Сколько задач вы выполняете для каждого клиента? Можете ли вы поделиться фрагментом кода для этого? – robin

+1

Не можете ли вы использовать 'Thread.sleep (X * 1000)' непосредственно перед вызовом основной части задачи? – learningloop

ответ

4

Вы можете запланировать несколько TimerTasks с помощью одного таймера, они просто не могут работать одновременно. В зависимости от вашей потребности это может быть достаточно хорошим.

Но, со ссылкой на Javadoc из Timer:

Java 5.0 представил java.util.concurrent пакет и одну из утилит для параллелизма в нем является ScheduledThreadPoolExecutor что пул потоков для повторного выполнения задач при заданной скорости или задержке. Это эффективная замена для комбинации Timer/TimerTask, так как она позволяет использовать несколько потоков обслуживания, принимает различные единицы времени и не требует подкласса TimerTask (просто реализуйте Runnable). Конфигурирование ScheduledThreadPoolExecutor с одним потоком делает его эквивалентным Timer.

0

Если вы хотите имитировать 1000 (и более) клиентов, действующих одновременно, вы должны использовать Thread s! В противном случае у вас будет единственный поток, в котором ваша определенная логика определяет, когда какая логика выполняется клиентом - это действительно не имитирует клиентов, действующих параллельно.

+0

Ответ на швы @Andreas весьма полезен для минимизации количества потоков через * совместное использование * ThreadPool, но это не меняет моего мышления, что вы должны использовать Threads прямо или косвенно. –