Существует ли класс java.util.concurrent, который позволит периодически запускать потоки без блокировки для завершения?

1

У меня есть следующее требование.

Я пытаюсь создать симулятор, который будет генерировать нагрузку на систему с целью тестирования нагрузки. Я хочу, чтобы потоки начинались каждые X миллисекунд, каждый из которых запускает задачу, которая занимает Y миллисекунды, причем Y может быть на 2 или 3 порядка> X.

Я думал, что могу использовать ScheduledExecutorService.scheduleAtFixedRate(). Это не сработало. Я вижу следующий комментарий javadoc, который объясняет, почему:

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

Одновременное выполнение - именно то, что я хочу. Я хочу начать много задач в отдельных потоках, позволить им делать то, что они делают, с большим пулом потоков и заканчивать, когда они заканчиваются. Дело в том, чтобы генерировать нагрузку для тестирования нагрузки.

Есть ли что-нибудь в java.util.concurrent, которое позволит мне это сделать? Я читаю эти джавадоки, но теперь они поворачивают голову.

  • 0
    Рассматривали ли вы TimerTask ?
  • 1
    Не уверен, что понимаю. Вы хотите делать что-то вроде запуска нового потока каждые 10 миллисекунд, каждый поток работает 1000 миллисекунд, а затем умирает? Со временем нагрузка увеличится. Почему бы просто не начинать новую тему каждые 10 миллис? Зачем использовать пул потоков?
Теги:
multithreading
java.util.concurrent

1 ответ

1
Лучший ответ

Вы можете использовать scheduleAtFixedRate(control, 10l, 1l, TimeUnit.SEDONDS) для создания и выполнения новых задач (в других потоках), аналогично:

    final ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(100);
    Runnable control = new Runnable()
    {
      public void run() {
        Runnable task = new Runnable() {
          public void run() {
             // do work here
          }
        };
        pool.execute(task);
      };
    };
    pool.scheduleAtFixedRate(control, 5l, 1l, TimeUnit.SECONDS);
  • 0
    И в качестве дополнения обязательно правильно рассчитайте размер пула. Если ваша задача выполняется максимум 100 мс, и вы хотите запускать ее каждые 10 мс, вам нужно как минимум 100 мс / 10 мс + 1 = 11 потоков, чтобы это работало.
  • 1
    @eckes - Как это обходит ограничение, которое я разместил в оригинальном сообщении? «Если какое-либо выполнение этой задачи занимает больше времени, чем ее период, последующие выполнения могут начаться с опозданием, но не будут выполняться одновременно».
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню