2016-10-23 5 views
-1

Ich bin neu zu Frühling mit ExecutorService. Bitte können Sie den folgenden Code bestätigen? Ich habe ExecutorSerive in Methode initiert und es in der @PreDestroy Methode destoryed.Ist es notwendig, shutdownNow() zu benennen. Wenn ja, wo wäre es?Spring mit Executor Service

private static final int FIXED_THREAD_POOL_SIZE =3; 

private static final Log LOGGER = LogFactory.getLog(HotelProgramInfoHistoryService.class); 

private ExecutorService executorService; 


@PostConstruct 
public void initialize() throws Exception { 

    if(executorService == null) { 
     this.executorService = Executors.newFixedThreadPool(FIXED_THREAD_POOL_SIZE); 
    } 
} 

public void sendRequest(DomainSecurity security, HotelProgramInfo hotelProgramInfo) { 

    try { 
     ProgramInfoHistoryUpdateTask programInfoHistoryUpdateTask = new ProgramInfoHistoryUpdateTask(hotelProgramInfo); 
     this.executorService.submit(programInfoHistoryUpdateTask); 
    } catch (Exception exception) { 
     LOGGER.error("Exception occurred while submitting update task ", exception); 
    } 

} 

@PreDestroy 
public void cleanUp() throws Exception { 
    if(executorService != null) 
    { 
     executorService.shutdown(); 
    } 
} 
} 

Antwort

0

Es hängt von Ihren Bedürfnissen ab. Da der java-doc eindeutig für die Shutdown-Methode heißt es:

... previously submitted 
tasks are executed, but no new tasks will be accepted 

wheras die shutdownNow die aktuell ausgeführte Aufgabe zu stoppen versucht. Probieren heißt "beste Anstrengung". Die Implementierung der Aufgabe muss zusammenarbeiten, um auf eine "Stopp" -Anforderung von außen (in der Regel durch Thread.interrupt) richtig zu reagieren.

Weder das shutdown noch das shutdownNow warten, bis laufende Tasks (Threads) wirklich beendet sind. Ein Java-Programm wird nur beendet, wenn der letzte Thread beendet wurde, nicht nur der Haupt-Thread. (Nun, hängt von der Einstellung des Threads-Daemon-Flags ab. Da Sie sich jedoch auf eine Standard-Executor-Implementierung verlassen, haben Sie dies nicht im Griff, ohne eine benutzerdefinierte ThreadFactory bereitzustellen, z. B. bei der Verwendung des ThreadPoolExecutors.)

Verwandte Themen