2016-07-19 3 views
1

に私は彼らの支店コードとそのスレッドを呼び出し、多くの枝官からスレッドを(Runnableを実装して)持っています。私はブランチコードでスレッドの名前を設定しました。 問題は次のとおりです...は例外

  1. 実行中のスレッドで例外が発生した場合、私はそれを停止できません。 "ExceptionInInitializerError"または "OutOfMemoryError:Java heap space"という名前の別のスレッドを作成しようとすると、
  2. "OutOfMemoryError:Javaヒープスペース"の例外が発生します。
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(); 
    } 
} 

Threadクラスは、ここで

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

私はあなたが求めているものは考えています。スレッドの実行メソッド内で例外が発生した場合、例外が発生するだけで、例外を処理するエンドレスループを実装していない限り、単純に終了します。言い換えれば、あなたのスレッドが例外をヒットした場合、コードがそのメソッドから返ってきたことを確認してください(例外を記録した後など)。 – GhostCat

+0

[実行可能なインターフェイスを実装して作成されたスレッドを停止するにはどうすればよいですか?](http://stackoverflow.com/questions/10630737/how-to-stop-a-thread-created-by-implementing-runnable-interface) –

+2

'ExecutorService'を使用し、タスクをサブミットするときに返される' Future'を取り消します。また、 'Runnable'の代わりに' Callable'を使うこともできます。 'call()'メソッドは、明示的に処理するのではなく、チェックされた例外を投げることを許可します。 –

答えて

1

あなたはここに複数の問題に直面している:

  1. あなたは自分自身でスレッドに参加することはできません。 Thread.join()スレッドが終了するまで待ちます。しかし、停止したいスレッドから呼び出すと、永遠に待っているだけです。あなたは、単にそのrun()メソッドから返す必要がスレッドを停止する

  2. 。あなたのケースでは、ちょうどあなたのcatch節の代わりcloseThread()を呼んでreturnを追加します。

  3. あなたには、いくつかのメモリの問題を持っているようです。 exportCorner()で何をしても、たくさんのメモリが使用されるか、一度に多くのスレッドに作成されます。アンディ・ターナーは、コメントで述べたように、あなたのRunnable秒を処理するためにExecutorServiceを使用するのに便利かもしれません。これはあなたのスレッドを管理し、スレッド数を制限するのに役立ちます。

+0

ありがとうございました。 –