2013-07-20 25 views
31

Ich bin neu in Threads. Ich wollte eine einfache Funktion erstellen, die getrennt vom Hauptthread arbeitet. Aber es scheint nicht zu funktionieren. Ich möchte nur einen neuen Thread erstellen und dort einige Dinge tun, unabhängig davon, was im Hauptthread passiert. Dieser Code sieht vielleicht komisch aus, aber ich habe bisher nicht viel Erfahrung mit Threading. Kannst du mir erklären, was damit nicht stimmt?Java - Erstellen eines neuen Threads

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

[Java Tutorials - Definieren und Starten eines Threads] (http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html) –

+1

Ich kann das Buch Java Concurrency In Practice empfehlen, wenn Sie neu sind zu Themen, möchte aber mehr wissen. Es ist ein unterhaltsames Buch und es führt Sie durch Threads, die mit den grundlegenden Konzepten beginnen. – sbrattla

Antwort

70

Sie rufen die one.start() Methode in der run Methode des Thread. Die Methode run wird jedoch nur aufgerufen, wenn ein Thread bereits gestartet wurde. Tun Sie dies statt:

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

Sie müssen zwei Dinge tun:

  • Starten Sie den Faden
  • Warten auf das Gewinde zu beenden (die), bevor Sie fortfahren

dh

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

Wenn Sie nicht ' t start() es, nichts wird passieren - Erstellen eines Thread nicht ausführen.

Wenn Sie dies nicht tun join) es, Ihr Hauptthread beenden und verlassen kann und die ganze Programm Ausfahrt vor der anderen Thread geplant wurde auszuführen. Es ist unbestimmt, ob es läuft oder nicht, wenn Sie nicht beitreten. Der neue Thread wird normalerweise ausgeführt, kann jedoch manchmal nicht ausgeführt werden. Besser, um sicher zu sein.

+0

Das Starten eines Threads und das sofortige Verbinden ist die Ausnahme und nicht die Regel. Wenn wir das immer tun, hätten wir nie mehr als zwei Threads gleichzeitig und einer von ihnen würde in der 'join()' warten. Wenn das, was Sie meinten, eher in Richtung "Teil des Threads an dem Punkt in dem Code, an dem Sie die Arbeit erledigt haben möchten" erfolgt ist, würde ich der Empfehlung zustimmen. – Rob

+0

@Rob Normalerweise würden Sie einem Thread nicht beitreten, aber in diesem Fall ruft er ihn von seinem 'main()', was dann (scheinbar) nichts anderes tut, so dass es "sofort" verlassen kann, und wenn der Haupt-Thread beendet wird Die JVM wird heruntergefahren - alle (Nicht-Daemon) -Threads werden gelöscht und die noch nicht ausgeführten werden niemals ausgeführt. Es wurde nur 'Join()' wegen der besonderen Situation empfohlen. – Bohemian

1

Wenn Sie mehr Thema erstellt werden soll, in obigen Fall haben Sie den Code in run-Methode zu wiederholen oder zumindest wiederholen innen eine Methode aufrufen.

Versuchen Sie dies, die Ihnen helfen wird, so oft Sie benötigen, zu rufen. Es wird hilfreich sein, wenn Sie Ihren Lauf mehr als einmal und von vielen Orten ausführen müssen.

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

Hauptklasse

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

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

können Sie tun:

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

Ein einfacher Weg sein kann:

new Thread(YourSampleClass).start();  
5

Ziel, Code zu schreiben war zu nennen start() und join() an einem Ort. Parameter anonyme Klasse ist eine anonyme Funktion.new Thread(() ->{})

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

Im Körper einer anonymen Klasse hat Instanz-Block, den Start() aufruft. Das Ergebnis ist eine neue Instanz der Klasse Thread, die Join() genannt wird.

+2

Willkommen bei Stackoverflow. Im Allgemeinen werden Antworten, die auch eine Erklärung enthalten, besser angenommen. Vielen Dank! – JoelC

+0

Ja, die Erklärung hier wird nicht verhindern) ** Das Ziel ** war, Code zu schreiben, um _start() _ und _join() _ ** an einem Ort ** aufzurufen. Parameter anonyme Klasse ist eine anonyme Funktion. Im Rumpf einer anonymen Klasse hat Instanz-Block, der start() aufruft. Das Ergebnis ist eine neue Instanz der Klasse Thread, die Join() genannt wird. –

+0

besser, um Ihre Erklärung der tatsächlichen Antwort hinzuzufügen, indem Sie es bearbeiten – Aequitas

Verwandte Themen