Perché non iniziare una discussione nel costruttore? Come terminare?

Sto imparando come usare i thread in Java. E ho scritto una class che implementa Runnable per essere eseguita contemporaneamente su un altro thread. Il thread principale gestisce l’ascolto della porta seriale dove il secondo thread gestirà l’invio di dati a quella stessa porta.

public class MyNewThread implements Runnable { Thread t; MyNewThread() { t = new Thread (this, "Data Thread"); t.start(); } public void run() { // New Thread code here } 

Il primo thread inizia il secondo in questo modo:

 public class Main { public static void main(String[] args) throws Exception{ new MyNewThread(); // First thread code there } } 

Funziona ma il mio compilatore segnala un avvertimento dicendo: È pericoloso iniziare un nuovo thread nel costruttore. Perchè è questo?

La seconda parte di questa domanda è: come faccio se ho un ciclo in esecuzione in un thread (la thread seriale ascolta thread) e scrivo un comando exit nel mio secondo thread. Come faccio a terminare il primo thread? Grazie.

    Alla tua prima domanda: l’avvio di un thread in un costruttore che passa in this evita this . Ciò significa che stai effettivamente dando un riferimento al tuo object prima che sia completamente costruito. La discussione inizierà prima della fine del costruttore. Ciò può provocare tutti i tipi di comportamenti strani.

    Alla tua seconda domanda: non esiste un modo accettabile per forzare un altro thread a fermarsi in Java, quindi dovresti usare una variabile che il thread controllerebbe per sapere se dovrebbe fermarsi o no. L’altro thread lo imposterà per indicare che il primo thread si fermerebbe. La variabile deve essere volatile o tutti gli accessi sincronizzati per garantire una corretta pubblicazione. Ecco un codice che sarebbe qualcosa di simile a quello che vuoi.

     public class MyNewThread implements Runnable { private final Thread t; private volatile boolean shouldStop = false; MyNewThread() { t = new Thread (this, "Data Thread"); } public void start() { t.start(); } public void stop() { shouldStop = true; } public void run() { while(!shouldStop) { // do stuff } } } 

    Qualunque cosa voglia creare e iniziare il thread farebbe:

     MyNewThread thread = new MyNewThread(); thread.start(); 

    Qualunque cosa voglia fermare il thread farebbe:

     thread.stop(); 

    Diamo un’occhiata a un esempio di base:

     class MyClass implements Runnable{ int a = 0; String b = null; public MyClass(){ new Thread(this).start(); b = "Foo"; } public void run(){ a = b.length(); //can throw NullPointerException } } 

    In questo caso, si dice che MyClass.us sfugge al costruttore. Ciò significa che l’object è disponibile come riferimento ma non tutti i campi che vengono creati nel costruttore potrebbero non essere creati. Per portare questo ad un altro livello, cosa succederebbe se b fosse final Si aspetterebbe che sia disponibile ma non è garantito. Questo è noto come oggetti parzialmente costruiti ed è perfettamente legale in java.

    a proposito della seconda domanda, puoi verificare se il secondo thread è stato terminato o meno dal metodo isAlive e se si usare la parola chiave break per distriggersre il ciclo per il primo thread allora verrà terminato se non si deve fare nulla

     public class MyNewThread implements Runnable { Thread t; MyNewThread() { t = new Thread (this, "Data Thread"); t.start(); } public void run() { reading code ................ // New Thread code here } 

     public class Main { public static void main(String[] args) throws Exception{ MyNewThread thread = new MyNewThread(); while(true) { listening code ................... if(!thread.t.isAlive()) break; } } } 

    La seconda parte di questa domanda è: come faccio se ho un ciclo in esecuzione in un thread (la thread seriale ascolta thread) e scrivo un comando exit nel mio secondo thread. Come faccio a terminare il primo thread?

    Continua a fare il ciclo fino a quando non viene raggiunta una condizione. Per esempio:

     public void run() { while ( !inputConsole.getCommand().equals("exit") ) { //Do Something Thread.sleep(1000); //put thread to sleep for 1 second } }