2013-07-22 5 views
1

Я ищу вариант ScheduledExecutor, который позволяет запускать задание с определенным интервалом, не дожидаясь завершения предыдущей задачи.scheduleWithFixedDelay с параллельными задачами перекрытия

Приведенный ниже код содержит 12 различных линий вывода с интервалом 5000 мс.

Учитывая интервал выполнения 50 мс и размер пула потоков 10, я ищу решение, которое имеет 10 выходных строк в первые 550 мс, а затем паузу до тех пор, пока потоки не будут освобождены и могут быть повторно использованы.

ScheduledExecutorService pollingExecutorService = Executors.newScheduledThreadPool(10); 

    final Runnable pollingTask = new Runnable() { 
     public void run() { 
      System.out.println("running poller " + DateTime.now().toString()); 
      try { 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
      } 
      System.out.println("5000 passed"); 
     } 
    }; 

    ScheduledFuture<?> pollingHandler = 
      pollingExecutorService.scheduleWithFixedDelay(pollingTask, 
        0, 
        50, 
        TimeUnit.MILLISECONDS); 

    //wait secondsIdleBeforeShutdown seconds 
    try { 
     Thread.sleep(1000*60); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
+0

Не уверен, что ваш вопрос? – kosa

+0

И что не работает с кодом выше? Примечание: вы можете использовать 'TimeUnit.MINUTES.sleep (1)' вместо 'Thread.sleep (1000 * 60)' – fge

+0

Nambari, scheduleWithFixedDelay запустит следующий опросTask только после того, как предыдущий закончен. Я не хочу, чтобы он дождался завершения. Я хочу, чтобы он выполнял pollingTask каждые 50 мс. – Olja

ответ

0

попробовать это

ExecutorService ex = Executors.newFixedThreadPool(10); 
    for (;;) { 
     List<Future<?>> list = new ArrayList<>(); 
     for (int i = 0; i < 10; i++) { 
      Future<?> f = ex.submit(new Runnable() { 
       @Override 
       public void run() { 
        System.out.println("running poller " + new Date()); 
        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        System.out.println("5000 passed"); 
       } 
      }); 
      list.add(f); 
     } 
     for (Future<?> f : list) { 
      f.get(); 
     } 
    } 
+0

Спасибо Евгению. Вышеприведенное будет работать при условии, что во втором цикле цикла Thread.sleep (50) и непосредственно перед запуском потока. Это обеспечит запуск потоков с интервалом 50 мс. – Olja

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

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