2017-02-08 2 views
0

Ich habe einen Thread in Java, in dem Methode aufgerufen wird..Ich speicher eine Karte für jeden Thread, so dass ich es töten kann. Mein Beispielcode ist:Thread-Zeit der Ausführung in Java

Thread thread = new Thread(new Runnable() { 

     public void run() { 

      executeMethod(); 

     } 
    }); 

    thread.start(); 
    thread.setName("some Name"); 
    //Create Map to save each method call as thread 
    threadMap.put("some Name", thread); 

Jetzt möchte ich durch das Töten der Thread die Methode aufrufen stoppen, so dass ich so etwas wie haben:

public static void stop(String threadName) { 

    if (StringUtils.isNotEmpty(threadName)) { 
     Thread t = threadMap.get(threadName); 

     if (t != null && t.isAlive()) { 
      System.out.println("Going to kill the thread:" + threadName); 
      t.interrupt(); 
      System.out.println("killed!!"); 
     } else { 
      System.out.println("THREAD is null"); 
     } 
    } 

} 

Das Problem ist, wenn ich meine Stop-Methode genannt, t. isAlive() ist falsch. Ich nehme an, dass die Ausführungszeit der Methode die lebendige Zeit des Threads sein wird .. Am i Korrekt oder ich missverstehe es?

Antwort

-1

Die Ausführungszeit der Methode und die Startzeit des Threads sind unterschiedlich. Here ist, was Thread Lebenszyklus sagt:

Der Faden in runnable Zustand ist nach dem Aufruf der Methode start(), aber der Thread-Scheduler hat es nicht aktiviert der laufende Faden sein.

So, Aufruf der start() Methode garantiert nicht unbedingt die Ausführung von Thread. Es hängt davon ab, wie jvm und Opatiating System Threads behandelt. Ein Thread kann für eine gewisse Zeit im Zustand runnable bleiben, bevor er mit der executeMethod Methode beginnt oder er executeMethod startet, sobald start() aufgerufen wird, aber keines dieser Verhaltensweisen ist garantiert. Dies ist, was javadoc sagt:

Jeder Thread hat eine Priorität. Threads mit höherer Priorität werden vor Threads mit niedrigerer Priorität bevorzugt. Jeder Thread kann auch als Daemon markiert sein oder nicht. Wenn Code, der in einem Thread ausgeführt wird, ein neues Thread-Objekt erstellt, wird die Priorität des neuen Threads zunächst der Priorität des Erstellungs-Threads und nur dann ein Daemon-Thread zugewiesen, wenn es sich bei dem Erstellungs-Thread um einen Daemon handelt.

Also sollten Sie nicht erwarten, dass die tatsächliche Zeit des Threads die Ausführungszeit der Methode ist.

+0

Beide Zitate dokumentieren nicht, welcher Wert von der isAlive() - Methode zurückgegeben werden soll. Mit einer solchen Logik sollte es niemals auf einem einzelnen CPU-Kernsystem den Wert true zurückgeben, da wir die isAlive() -Methode aufrufen, unser aufrufender Code läuft, so dass der Thread nicht läuft. – h22

+0

Ich beantwortete die folgende Frage von OP: 'Ich nehme an, dass die Ausführungszeit der Methode die lebendige Zeit des Threads sein wird. Glauben Sie nicht, dass die Frage ist, welcher Wert von der 'isAlive()' Methode zurückgegeben werden soll. –

0

Threads sterben auch, nachdem sie run() Methode zurückgibt. In diesem Fall ist der Thread nicht aktiv. Fügen Sie die sleep-Anweisung in die Methode run() ein und fügen Sie print-Anweisungen vor und nach dem Befehl hinzu, um sich über den aktuellen Status des Threads zu vergewissern.

Thread.interrupt tötet den Thread nicht, setzt ihn nur fort, wenn er angehalten wurde, und es ist im Allgemeinen keine gute Idee, Threads manuell zu beenden. Lesen Sie this question, um zu verstehen, warum und was stattdessen zu tun ist.

0
As per Thread Class java doc 
    https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html 

Thread.getState() will return you state of the thread 
which you can check if thread is still running and then can kill it. 

Thread.State = getState() Returns the state of this thread. 

A thread state. A thread can be in one of the following states: 
NEW 
A thread that has not yet started is in this state. 
RUNNABLE 
A thread executing in the Java virtual machine is in this state. 
BLOCKED 
A thread that is blocked waiting for a monitor lock is in this state. 
WAITING 
A thread that is waiting indefinitely for another thread to perform a particular action is in this state. 
TIMED_WAITING 
A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state. 
TERMINATED 
A thread that has exited is in this state. 
Verwandte Themen