2016-07-19 6 views
1

Ich habe einen Thread (implementiert Runnable) von vielen Zweig-Officer aufrufen, dass Thread mit ihrer Branche Code. Ich habe einen Namen ihres Threads mit dem Branch Code eingerichtet. Die Probleme sind ...Laufen viele Thread-und Stop-Thread auf Ausnahme

  1. Wenn eine Ausnahme Thread in Lauf aufgetreten - das kann ich nicht mehr aufhören. Und wenn Sie versuchen, einen anderen Thread mit einem beliebigen Namen "ExceptionInInitializerError" oder "OutOfMemoryError: Java-Heap-Speicherbereich" kommt
  2. "OutOfMemoryError: Java-Heap-Space" Ausnahme kommt Wenn 2 oder mehr Thread zur gleichen Zeit ausgeführt wird.
public MyRunnerClass { 

    //This method called from many branch with their branch Code 
    public void executeBranchProcess(String branchCode){ 
     Thread t = new Thread(new Exporter(branchCode); 
     t.setName(branchCode); 
     t.start(); 
    } 
} 

Klasse Thread hier

public class Exporter implements Runnable{ 
    private String branchCode; 

    public Exporter(String branchCode){ 
     this.branchCode = branchCode; 
    } 

    @Override 
    public void run() { 
     try { 
      exportCorner(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void exportCorner() throws InterruptedException{ 
     try{ 
      //Some Process 
     }catch(Exception e){ 
      // I want to close running thread here 
      // I am using closeThread(this.branchCode), but not working 
     } 
    } 


    static void closeThread(String branchCode) throws InterruptedException { 
     Thread thread = null; 
     for (Thread t : Thread.getAllStackTraces().keySet()) { 
      if (t.getName().equals(branchCode)) 
       thread = t; 
     } 
     if (thread != null) { 
      thread.interrupt(); 
      thread.join(); 
     } 
    } 
} 
+2

Ich habe keine Ahnung, was Sie fragen. Wenn innerhalb der Run-Methode eines Threads eine Exception auftritt, dann stirbt sie einfach ab (es sei denn, es wird eine Art Endlosschleife implementiert, die einfach Ausnahmen verschlingt, anstatt auf sie zu reagieren). Mit anderen Worten: Wenn Ihr Thread eine Exception erreicht, stellen Sie einfach sicher, dass Ihr Code von dieser Methode "zurückkehrt" (zum Beispiel nach der Protokollierung der Exception) und Sie sollten gut sein. – GhostCat

+0

Mögliches Duplikat von [Wie man einen Thread stoppt, der durch die Implementierung der Runnable-Schnittstelle erstellt wurde?] (Http://stackoverflow.com/questions/10630737/how-to-stop-a-thread-created-by-implementing-runnable-interface) –

+2

Verwenden Sie einen 'ExecutorService' und brechen Sie die' Zukunft' ab, die zurückgegeben wird, wenn Sie eine Aufgabe an sie senden. Außerdem können Sie 'Callable' anstelle von' Runnable' verwenden, dessen Methode 'call()' Ihnen erlaubt, überprüfte Ausnahmen zu werfen, anstatt sie explizit zu behandeln. –

Antwort

1

Sie stehen hier mehrere Probleme:

  1. Sie können nicht einen Thread in sich verbinden. Thread.join() wartet bis der Thread stirbt. Aber wenn Sie es aus dem Thread aufrufen, den Sie stoppen möchten, wartet es für immer.

  2. Um einen Thread zu stoppen, müssen Sie einfach von seiner run() Methode zurückkehren. Fügen Sie in Ihrem Fall nur return in Ihrer catch-Klausel hinzu, anstatt closeThread() aufzurufen.

  3. Es scheint, dass Sie einige Speicherprobleme haben. Was auch immer Sie in exportCorner() tun, verwendet viel Speicher oder Sie erstellen zu viele Threads auf einmal. Wie Andy Turner in den Kommentaren erwähnt hat, könnte es nützlich sein, einen ExecutorService zu verwenden, um Ihre Runnable s zu behandeln. Dadurch können Sie Ihre Threads verwalten und eine begrenzte Anzahl von Threads sicherstellen.

+0

Vielen Dank für einen guten Vorschlag. –

Verwandte Themen