2013-03-17 23 views
5

Sono un nuovo concorrente e thread - e li ho utilizzati durante lo sviluppo della mia applicazione sul posto di lavoro. Essenzialmente ho un numero di thread nella mia applicazione RMI (componente lato server) che esegue il polling delle modifiche nei file (questi file vengono aggiornati ogni pochi secondi).Thread daemon Java

Durante il test su una casella di sviluppo ho eseguito il server dalla riga di comando e quindi chiuso manualmente al termine e risciacquo e ripetuto per tutto il giorno.

Come si evince, penso che i miei thread potrebbero non fermarsi quando chiudo la riga di comando e continuo a processare. Questo sta portando ad alcuni effetti collaterali molto negativi - anche se non sono sicuro al 100% se è possibile, quindi spero che qualcuno possa confermare che questo potrebbe essere il caso.

Se faccio un thread un daemon - questo significa che quando chiudo la riga di comando - questi thread si fermeranno automaticamente? Ho bisogno di un modo di terminare l'applicazione bene, ma perché il server alla fine sarà gestito da AutoSys non sono sicuro che cosa è il modo migliore per rendere tutte le discussioni finiscono quando spegnere

Grazie

+0

questa domanda ha un taglio leggermente diverso e ha anche un'altra domanda all'interno del corpo - sarei davvero grato se non è stato chiuso – Biscuit128

+0

La sua domanda principale nasce da una mancanza di comprensione di ciò che "demone" significa per Java, in tal modo il link alla domanda duplicata. Per quanto riguarda la tua altra domanda (presumo sia quella sulla chiusura sicura della tua applicazione), dovrebbe essere chiesta separatamente poiché si tratta di una domanda separata. – Jeffrey

risposta

1

Il codice seguente illustra la creazione di un pool di thread con un'attività in esecuzione fittizia, l'attività viene quindi avviata e al termine dell'applicazione viene eseguito un hook di arresto che annulla tutte le attività in esecuzione e chiude in modo pulito il pool di thread.

Non è necessario utilizzare Callable come è possibile, è possibile utilizzare Runnables e il metodo threadPool.execute e terminare semplicemente il threadPool che è un po 'meno elegante.

final ExecutorService threadPool = Executors.newCachedThreadPool(); 
    final List<Future<Void>> runningTasks = new ArrayList<>(); 
    Future<Void> task = threadPool.submit(new Callable<Void>() { 

     @Override 
     public Void call() throws Exception { 
      int count = 0; 
      while(true) { 
       System.out.println(++count); 
       Thread.sleep(1000); 
      } 
     } 
    }); 
    runningTasks.add(task); 

    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      for(Future<Void> runningTask : runningTasks) { 
       runningTask.cancel(true); 
      } 
      threadPool.shutdownNow(); 
     } 
    }); 

I ganci di arresto sono per applicazioni standalone. In un contenitore Java EE, è possibile fare lo stesso con javax.servlet.ServletContextListener

+0

grazie per il consiglio, vuol dire che dovrò usare l'ascoltatore di contesto servlet opposto al gancio di arresto? è molto dello stesso tipo di cose? – Biscuit128

+0

In un'applicazione Java standalone è possibile utilizzare un hook di arresto, in un'applicazione Web Java si utilizza ContextListener. Dipende se si puliscono i thread sul client o sul server. – JayTee

+0

sì tutti i thread dovranno essere fermati. – Biscuit128

1

I thread vengono eseguiti all'interno di una Java Virtual Machine. Se interrompi la JVM, i thread non vengono più eseguiti. Si potrebbe vedere uscire dalla JVM come staccare la spina dal computer: nulla può essere eseguito più.

0

RMI Runtime crea thread che non è possibile interrompere. L'unico modo per arrestare il servizio è con System.exit().

Faccio questo in una discussione separata. Dopo: nuovo ShutThread(). Start(), il thread di spegnimento attende 2 secondi per dare a qualsiasi messaggio in sospeso la possibilità di completare il viaggio, quindi emette System.exit().

+0

quindi per un server che viene avviato dalla riga di comando - senza argomenti utilizzando java -jar server.jar - una volta che questo è in esecuzione come facciamo a passare un messaggio ad esso dicendo di uscire con garbo? – Biscuit128

+0

Buon punto. Scrivo software server in modo da includere un metodo di spegnimento come prassi standard. Se altri non consentono questa funzione, forse dovrebbero. – edharned