0

В настоящее время я работаю над реализацией многопроцессорной обработки с использованием API ThreadPoolExecutor. Ниже приведено требование к обработкеThread Executor: запуск нескольких процессов и пула в течение 30 минут перед запуском следующего процесса

  1. Определенное количество. процесса Java для запуска в то время, используя ThreadPool с помощью ExecutorService executor = Executors.newFixedThreadPool(3);
  2. И я вношу все сам процесс работоспособного процесса банки объединить

    for(int i=1; i<50; i++) { 
        RunnableTask r=new RunnableTask(); 
        executor.submit(r); 
    } 
    

и фактическая RunnableTask является следующей

public class RunnableTask implements Runnable{ 
    public void run(){ 
    Process p=Runtime.exec("java -jar D:\ProcessIntiate.jar"); 
} 

Теперь, когда пул запущен, начнется только 3 процесса.

Я хочу запускать только 3 процесса за раз, и после завершения 3 процесса мой пул должен ждать 30 минут и ему нужно запустить следующие 3 процесса. И уведомление должно быть необходимо для объединения, когда все 3 процесса завершены.

Есть ли способ использования ThreadExcutorFramwork?

+0

Почему вы хотите запустить Java-код в другом процессе в первую очередь? Вы могли бы также использовать отдельный загрузчик классов и сохранить все в JVM, который уже запущен? Просто говорю .. – GhostCat

+0

@GhostCat, спасибо за ответ. Но фактическая бизнес-логика находится в этом банке ProcessIntiate.jar (назначая минимальную и максимальную память для этого во время работы) (java -jar -xms512m -xmx2048m D: \ ProcessIntiate.jar). Это длительный процесс, и для этого потребуется больше памяти. это процесс должен контролироваться пулом до завершения – Raj

ответ

0

Простое решение: просто добавьте 30-минутное ожидание кода Runnable.

Или лучше: дать плавающий параметр, который определяет, как долго он ждет. Для первых 47 процессов вы даете 30 минут; а затем 0.

Альтернативно просто не отправляйте 50 заданий. Вместо этого: используйте внешний поток, который толкает 3 задачи, а затем ждет/спит, пока эти 3 не будут выполнены. Затем подождите 30 минут и нажмите еще раз.

+0

Я не могу дать 30 минут одиночному Runnable, и пул должен ждать после завершения 3-х процессов. после завершения 3 процесса. Подождите 30 минут ... следующий 3 процесс должен выполняться пулом и т. д. Фактическая бизнес-логика находится в этой банке ProcessIntiate.jar (присваивая ей минимальную и максимальную память (java -jar -xms512m -xmx2048m D: \ ProcessIntiate.jar). Это длительный процесс, и для этого потребуется больше памяти.этот процесс должен контролироваться пулом до завершения. – Raj

+0

@ Rajasekhar_b_1989 Некоторая обратная связь будет приветствоваться. Я дал вам два пути; но ни повышать, ни принимать; и даже не комментарий «Мне нужна дополнительная помощь, потому что». Короче говоря: другие люди проводили время, чтобы помочь вам; поэтому рассмотрим одну минуту, чтобы получить какую-то обратную связь с ними! – GhostCat

0

Вместо прямой отправки запроса в пул потоков храните его в коллекции.

Используйте службу ScheduledExecutorService с размером 1, чтобы запланировать задачу, которая будет работать после указанного интервала (скажем, 30 минут в вашем случае).

Это займет задание из коллекции в пакетном режиме и отправит его в другой пул, где он фактически запрограммирован на обработку поставленной задачи.

class CustomScheduledExecutor { 
ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(1); 
ExecutorService executorService = Executors.newFixedThreadPool(3); 

Queue<Runnable> queue = new ConcurrentLinkedQueue<Runnable>(); 

public CustomScheduledExecutor(){ 
    scheduleExecutor.scheduleWithFixedDelay(new Runnable() { 

     @Override 
     public void run() { 
      for(int i=0;i<3;i++){ 
       Runnable poll = queue.poll(); // Do the handling for queue size 
       executorService.submit(poll); 
      } 
     } 
    }, 1000, 30, TimeUnit.MINUTES); 
} 

public void submitTask(Runnable runnable){ 
    queue.offer(runnable); 
} 

} 

submit также возвращает будущие экземпляры, поэтому у вас есть контроль над поставленной задачей и вы можете манипулировать по мере необходимости.

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