2013-07-20 26 views
31

Sono nuovo ai thread. Volevo creare una semplice funzione che funzioni separatamente dal thread principale. Ma non sembra funzionare. Mi piacerebbe solo creare un nuovo thread e fare alcune cose lì indipendentemente da ciò che sta accadendo sul thread principale. Questo codice potrebbe sembrare strano ma non ho molta esperienza con il threading finora. Potresti spiegarmi cosa c'è di sbagliato in questo?Java - creazione di una nuova discussione

public static void main(String args[]){ 
     test z=new test(); 

     z.setBackground(Color.white); 

     frame=new JFrame(); 
     frame.setSize(500,500); 
     frame.add(z); 
     frame.addKeyListener(z); 
     frame.setVisible(true); 

     one=new Thread(){ 
      public void run() { 
       one.start(); 
       try{ 
        System.out.println("Does it work?"); 
        Thread.sleep(1000); 
        System.out.println("Nope, it doesnt...again."); 
       } catch(InterruptedException v){System.out.println(v);} 
      } 
     }; 
    } 
+0

[Esercitazioni Java - Definizione e avvio di un thread] (http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html) –

+1

Posso consigliare il libro Concurrency Java In Practice se sei nuovo alle discussioni ma vorrei saperne di più. È un libro divertente e ti porta attraverso discussioni che iniziano con i concetti di base. – sbrattla

risposta

70

si sta chiamando il metodo one.start() nel metodo della discussione run. Ma il metodo run verrà chiamato solo quando un thread è già stato avviato. Fate questo invece:

one = new Thread() { 
    public void run() { 
     try { 
      System.out.println("Does it work?"); 

      Thread.sleep(1000); 

      System.out.println("Nope, it doesnt...again."); 
     } catch(InterruptedException v) { 
      System.out.println(v); 
     } 
    } 
}; 

one.start(); 
6

Hai bisogno di fare due cose:

  • avviare il thread
  • Attendere che il thread per finire (die) prima di procedere

cioè

one.start(); 
one.join(); 

Se non si t start() it, non accadrà nulla - creazione a Thread non esecuzione it.

Se non join) esso, il thread principale può terminare e uscire e tutto il programma di uscita prima l'altro thread è stato programmato per eseguire. È indeterminato se funziona o meno se non ci si aggiunge. In genere il nuovo thread può essere eseguito, ma a volte potrebbe non essere eseguito. Meglio essere certi.

+0

Avviare un thread e unirlo immediatamente è l'eccezione piuttosto che la regola. Se lo facciamo sempre, non avremmo mai più di due thread in esecuzione alla volta e uno di loro sarebbe in attesa in 'join()'. Se quello che volevi dire era più sulla falsariga di "unire la discussione al punto nel codice in cui ti occorre per completare il suo lavoro", allora sarei d'accordo con la raccomandazione. – Rob

+0

@Rob Normalmente non si unirebbe un thread, ma in questo caso lo chiamerà dal suo 'main()' che quindi (sembra) non fa nient'altro, quindi potrebbe uscire "immediatamente" e quando il thread principale termina la JVM si spegne: tutti i thread (non daemon) vengono uccisi e quelli non ancora eseguiti non verranno mai eseguiti. Stava solo raccomandando 'join()' a causa della particolare situazione. – Bohemian

1

Se si desidera creare più thread, nel caso precedente è necessario ripetere il codice all'interno del metodo run o almeno ripetere la chiamata all'interno di un metodo.

Prova questo, che ti aiuterà a chiamare tutte le volte che ti serve. Sarà utile quando è necessario eseguire la corsa più di una volta e da più posizioni.

class A extends Thread { 
    public void run() { 
      //Code you want to get executed seperately then main thread.  
    } 
    } 

Classe principale

A obj1 = new A(); 
obj1.start(); 

A obj2 = new A(); 
obj2.start(); 
11

potete fare come:

Thread t1 = new Thread(new Runnable() { 
    public void run() 
    { 
     // code goes here. 
    }}); 
    t1.start(); 
1

Un modo più semplice può essere:

new Thread(YourSampleClass).start();  
5

L'obiettivo era quello di scrivere codice per chiamare start() e join() in un unico punto. La classe anonima dei parametri è una funzione anonima.new Thread(() ->{})

new Thread(() ->{ 
     System.out.println("Does it work?"); 
     Thread.sleep(1000); 
     System.out.println("Nope, it doesnt...again.");  
}){{start();}}.join(); 

Nel corpo di una classe anonima ha istanza blocco che chiama start(). Il risultato è una nuova istanza della classe Thread, chiamata join().

+2

Benvenuti in Stackoverflow. Generalmente le risposte che includono anche una spiegazione saranno meglio accolte. Grazie! – JoelC

+0

Sì, la spiegazione qui non impedirà) ** L'obiettivo ** era scrivere codice per chiamare _start() _ e _join() _ ** in un unico punto **. La classe anonima dei parametri è una funzione anonima. Nel corpo di una classe anonima ha istanza-blocco che chiama start(). Il risultato è una nuova istanza della classe Thread, chiamata join(). –

+0

è meglio aggiungere la tua spiegazione alla risposta effettiva modificandola – Aequitas

Problemi correlati