2017-09-13 2 views
0

Von der Controller-Klasse zu kommunizieren, ich rufe diese Helfer einen Prozess zu starten und an dem UI-Rückkehr, den Prozesswie mit Executor-Service Themen

Helper Klasse gestartet:

public class Helper { 

public String startService() { //Before starting the service I save the status of the service as Started in the DB 

    ExecutorService service = Executors.newSingleThreadExecutor(); 
    service.submit(new Runnable() { 
     public void run() { 
     new Worker().startWork(callableTaskList); 
      } 
     }); 
return "started" 
    } 
public void stopService() { 
// I Saved the status in DB as Stopping (Just in case). but now how to pass flag an to pass to startWorkMethod to stop if some flag in false and stop processing. 
} 

Worker Klasse

public class Worker { 

    public void startWork(List<CallableTask> callableTaskList) throws Exception { 
     ExecutorService service=Executors.newFixedThreadPool(50); 
     ExecutorService anotherService=Executors.newFixedThreadPool(50); 
for (List<CallableTask> partition : Iterables.partition(callableTaskList, 500)){ 
      // do some work here and then return 
      List<Future<String>> futures=service.invokeAll(partition); 
      for(Future<String> future: futures){ 
       anotherService.submit(new Task(future.get())); 
      } 
     } 

Jetzt ist meine Frage, wie kann ich den Dienst stoppen, der gestartet wurde? Da callableTaskList eine riesige Liste ist, habe ich sie in Stapel unterteilt und verarbeitet. Wenn ich jetzt den Prozess stoppen möchte, wie kann ich das tun? Ich denke, es sollte ein Flag in der Worker-Klasse geben, dass es nach jedem Partitionierungslauf überprüft werden sollte, wenn ich weiter daran arbeiten sollte. Aber ich verstehe nicht, wie diese Flagge an die Arbeiterklasse übergeben werden. Ich habe eine Stop-Service-Methode erstellt, um ein flüchtiges atomares boolesches Flag zu erstellen und es an die startWork-Methode zu übergeben. aber ich denke, es wird nur funktionieren, wenn beide Singleton-Objekte sind. und da das Singleton-Objekt nur eine Instanz hat, kann es sein, dass ich auch andere aktuell laufende Dienste stoppe. (Nicht sicher, brauchen Klärung).

Danke.

+0

Ja. Hab es jetzt verstanden. Vielen Dank – Kid101

Antwort

0

Halten Sie auf jeder Ebene einen Verweis auf den ExecutorService, sodass shutdownNow() aufgerufen werden kann. Zum Beispiel:

public class Helper { 
     private ExecutorService service; 

     public String startService() { 
      // ExecutorService service = Executors.newSingleThreadExecutor(); 
      service = Executors.newSingleThreadExecutor(); 
      service.submit(new Runnable() { 
       public void run() { 
        new Worker().startWork(callableTaskList); 
       } 
      }); 
      return "started" 
     } 

    public void stopService() { 
     service.shutdownNow(); 
    } 
} 

jedoch hierfür die API zu arbeiten gibt die Callable/Runnable muss gut reagieren benommen und werden, wenn es unterbrochen.

Zum Beispiel:

public class Worker { 
     private ExecutorService service; 
     private ExecutorService anotherService; 

     public void startWork(List<CallableTask> callableTaskList) throws Exception { 
      service=Executors.newFixedThreadPool(50); 
      anotherService=Executors.newFixedThreadPool(50); 

      for (List<CallableTask> partition : Iterables.partition(callableTaskList, 500)){ 
       checkInterruptStatus(); 


       // do some work here and then return 
       List<Future<String>> futures=service.invokeAll(partition); 
       for(Future<String> future: futures){ 
        checkInterruptStatus(); 

        anotherService.submit(new Task(future.get())); 
       } 
      } 
     } 

     private void checkInterruptStatus() throws InterruptedException { 
      if (Thread.currentThread().isInterrupted()) { 
       throw new InterruptedException(); 
      } 
     } 

     public void stopService() { 
      service.shutdownNow(); 
      anotherService.shutdownNow(); 
     } 
    }