2016-12-07 3 views
0

私はスイングGUIを持つプログラムを持っており、私のJFramesの1つが処分されたときにスレッドを中断したい。これを行う簡単な方法はありますか?これは初めての並行処理です。スレッドの運命をオブジェクトに結びつける方法はありますか?

+0

http://stackoverflow.com/questions/10961714/how-to-properly-stop-the-thread-in-java:

ので、最終MyFrameとクラスは次のようになり – BackSlash

答えて

1

はい、あなたは、次の操作を行うことができます:

処分をJFrameのサブクラスを作成し、上書き()メソッド:

class MyFrame extends JFrame{ 
    private Thread otherThread; 

    public MyFrame(Thread otherThread){ 
     super("MyFrame"); 

     this.otherThread=otherThread; 
    } 

    ... 
    public void dispose(){ 
     otherThread.interrupt(); 
     super.dispose(); 
    } 
} 

しかし、注意してくださいをそのThread.interruptの使用()スレッドが中断された状態を制御することは事実上不可能であるため、推奨されません。

したがって、自分自身のThread(またはRunnable)サブクラスの '中断'フラグを手動で維持し、Threadがその作業を適切に停止するようにする方がよいでしょう。例えば

そして
class MyThread extends Thread{ 
    private boolean interrupted=false; 


    public void interruptMyThread(){ 
     interrupted=true; 
    } 

    public void run(){ 
     while(true){ 
      // ... some work the thread does 

      // ... a point in the thread where it's safe 
      // to stop... 
      if(interrupted){ 
       break; 
      } 
     } 
    } 
} 

、代わりをMyFrameにおけるスレッドの参照を有する、MyThread参照を使用し、その代わりにotherThread.interrupt()を呼び出す、otherThread.interruptMyThread()を呼び出します。

class MyFrame extends JFrame{ 
    private MyThread otherThread; 

    public MyFrame(MyThread otherThread){ 
     super("MyFrame"); 

     this.otherThread=otherThread; 
    } 

    ... 
    public void dispose(){ 
     otherThread.interruptMyThread(); 
     super.dispose(); 
    } 
} 
関連する問題