2016-11-24 5 views
1

Der Threadpool-Executor wird parallel zum Hauptthread ausgeführt. Der Haupt-Thread wartet nicht bis zum Herunterfahren des Executors.ThreadpoolExecutor und Hauptthread, die parallel ausgeführt werden

public static void main(String[] args) { 
     Date jobStartTime = null; 


     LOGGER.info("MainApp::Job started"); 
     try { 

      MainApp obj = new MainApp(); 
      // Getting the job Id of the job 
      String jobName=args[0]; //batch name 
      String fileName=args[1]; //sqoop file 

      LOGGER.info("MainApp::jobName: "+jobName+" fileName "+fileName); 

      currentJobID = obj.getMaxJobId(jobName); 

      LOGGER.info("MainApp:Job Id is" + currentJobID); 

      // Getting the start time of the job 
      jobStartTime = commonDB.getTime(); 
      LOGGER.info("MainApp:Job Start time is" + jobStartTime); 

      JobDetails job=new JobDetails(currentJobID,jobName,fileName); 

      // Reading and parsing the sqoop file and executing the sqoop commands 
      CommandGenerator exec=new CommandGenerator(); 
      List<TableInfo> commandList = exec.parseAndExec(job); 

      ThreadPoolExecutor tp = (ThreadPoolExecutor) Executors.newFixedThreadPool(10); 
      for (final TableInfo table : commandList) { 
       ParallelExecutor pe = new ParallelExecutor(table); 
       tp.execute(pe); 
      } 

      tp.shutdown(); 

      while(!tp.isShutdown()){ 

      } 

      job=new JobDetails(currentJobID,jobName,fileName,jobStartTime); 
      //put everything in one method 
      StatusAndMailUtils status=new StatusAndMailUtils(); 
      status.onJobCompletion(job); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      LOGGER.info("MainApp::Exception"); 
      e.printStackTrace(); 
     } 

    } 

Ich habe die while-Schleife verwendet, um den Haupt-Thread zu warten, während die Executor-Threads in Bearbeitung sind. Aber es hilft nicht. Bitte lassen Sie mich wissen, wie Sie den Haupt-Thread warten lassen können.

while(!tp.isShutdown()){ 

       } 

Antwort

1

Sie können auch diese Runnables einreichen und warten, bis sie zu vervollständigen. Es ist auch möglich, ein Zeitlimit anzugeben, um auf die Ausführung der Threads zu warten, bevor eine Ausnahme ausgelöst wird.

2

Natürlich wartet es nicht. Das ist die ganze Idee, einen Threadpool zu erstellen, damit Ihr Hauptthread andere Aufgaben ausführen kann, während der Threadpool zusätzliche Aufgaben ausführt.

Sie können die Methode awaitTermination(long timeout, TimeUnit unit) verwenden, damit Ihr Hauptthread pausiert, während der Threadpool seine Aufgaben beendet.

+0

Das Problem ist, die Aufgaben, die ich ausführe, laufen lange und ich bin nicht sicher, wenn diese Aufgaben abgeschlossen werden. Also kann ich die Zeitüberschreitung nicht bereitstellen. –

+0

@angularBeginner Warum nicht? Sicher werden Sie wissen, dass sie in weniger als 10 Jahren fertig sind. – Kayaman

3

Nachdem Sie shutdown() aufgerufen haben, können Sie awaitTermination(long timeout, TimeUnit unit) verwenden, um den aufrufenden Thread zu blockieren, bis alle Tasks die Ausführung abgeschlossen haben.

Als Timeout können Sie einen Wert verwenden, der übermäßig groß ist, wenn Sie so lange warten möchten, bis die Aufgaben abgeschlossen sind, da Ihr Thread ewig warten kann, wenn eine Aufgabe nie endet, ist es immer besser, sie festzulegen eine angemessene Zeitüberschreitung, um einige Aufgaben auszuführen, wenn sie ungewöhnlich lang sind.

Zum Beispiel:

tp.shutdown(); 
tp.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); 
Verwandte Themen