有没有办法将线程的命运与对象联系起来?

时间:2016-12-07 09:20:23

标签: java multithreading swing user-interface

我有一个带有swing GUI的程序,我想在我的一个JFrame被丢弃时中断一个线程。有快速的方法吗?这是我第一次使用并发。

1 个答案:

答案 0 :(得分:1)

是的,您可以执行以下操作:

创建一个JFrame子类并覆盖dispose()方法:

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)子类手动维护一个'interrupt'标志,让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()

因此,最终的MyFrame类看起来像:

class MyFrame extends JFrame{
   private MyThread otherThread;

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

       this.otherThread=otherThread;
   }

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