0

Derzeit arbeite ich Multiprozessoring mit ThreadPoolExecutor API implementieren. Nachfolgend ist die Anforderung zu verarbeiten:Thread Executor: läuft mehrere Prozesse und Pool warten 30 Minuten vor dem nächsten Prozess

  1. Definierte Nr. von Java-Prozess zu einem Zeitpunkt unter Verwendung von Threadpool mit ExecutorService executor = Executors.newFixedThreadPool(3);
  2. und ich bin die Einreichung aller eigentlichen Prozesses des runnable jar Prozesses zu laufen zu bündeln ist

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

und tatsächliche RunnableTask folgt

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

Jetzt, wenn der Pool gestartet wird, wird nur 3 Prozess parallel gestartet.

Ich möchte nur 3 Prozesse gleichzeitig ausführen und nach Abschluss von 3 Prozess muss mein Pool 30 Minuten warten und muss die nächsten 3 Prozesse starten. Außerdem muss eine Benachrichtigung zum Pooling erforderlich sein, wenn alle 3 Prozesse abgeschlossen sind.

Gibt es eine Möglichkeit mit ThreadExcutorFramwork?

+0

Warum möchten Sie Java-Code in einem anderen Prozess überhaupt ausführen? Sie könnten auch einen eigenen Klassenlader verwenden und alles in der JVM behalten, die bereits läuft? Nur zu sagen .. – GhostCat

+0

@GhostCat, vielen Dank für die Antwort. Die eigentliche Geschäftslogik befindet sich jedoch in diesem jar ProcessIntiate.jar (diesem wird bei der Ausführung ein minimaler und ein maximaler Speicher zugewiesen) (java -jar -xms512m -xmx2048m D: \ ProcessIntiate.jar). Dies ist ein langwieriger Prozess und wird mehr Speicher dafür verbrauchen. dies ist Prozess muss von Pool überwacht werden, bis zum Abschluss – Raj

Antwort

0

Eine einfache Lösung: Fügen Sie Ihrem Runnable-Code einfach 30 Minuten Wartezeit hinzu.

Oder besser: geben Sie dem Runable einen Parameter, der steuert, wie lange es wartet. Für die ersten 47 Prozesse geben Sie 30 Minuten; und dann 0.

Alternativ einfach nicht 50 Aufgaben vorlegen. Stattdessen: Verwenden Sie einen äußeren Thread, der 3 Aufgaben schiebt und dann wartet/schläft, bis diese 3 erledigt sind. Dann warten Sie 30 Minuten und drücken Sie eine andere 3.

+0

Ich kann 30 Minuten nicht geben, Runnable und Pool muss nach Abschluss der 3 Prozesse warten. einmal 3 Prozess abgeschlossen sind .. warten für 30 min ... nächsten 3 Prozess muss Pool ausgeführt werden und so weiter die eigentliche Geschäftslogik befindet sich in diesem jar ProcessIntiate.jar (Zuweisung von einigen minimalen und maximalen Speicher während while ausgeführt wird) (java -jar -xms512m -xmx2048m D: \ ProcessIntiate.jar). Dies ist ein langwieriger Prozess und wird mehr Speicher dafür verbrauchen.Dies ist der Prozess, der bis zum Abschluss überwacht werden muss. – Raj

+0

@ Rajasekhar_b_1989 Einige Rückmeldungen wären willkommen. Ich gab dir zwei Möglichkeiten zu gehen; aber weder aufheben, noch akzeptieren; und nicht einmal ein Kommentar "Ich brauche noch etwas Hilfe weil". Lange Rede, kurzer Sinn: Andere Menschen haben ihre Zeit genutzt, um Ihnen zu helfen. Überlege dir also die eine Minute, die es braucht, um ihnen Feedback zu geben! – GhostCat

0

Statt die Anfrage direkt an Thread-Pool zu senden, speichern Sie es in einer Sammlung.

Verwenden Sie einen ScheduledExecutorService mit der Größe 1, um eine Aufgabe zu planen, die nach einem bestimmten Intervall ausgeführt wird (in Ihrem Fall etwa 30 Minuten).

Er übernimmt die Aufgabe aus der Sammlung im Stapel und übergibt sie an einen anderen Pool, wo er tatsächlich so programmiert ist, dass er die übergebene Aufgabe verarbeitet.

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

} 

Senden auch zukünftige Instanzen zurück, so haben Sie eine Kontrolle über die übergebene Aufgabe und kann nach Bedarf manipulieren.

Verwandte Themen