线程的run()方法中有一个循环体:
public void run() {
while (!flag) {
synchronized (object) {
try {
object.wait();//object为主线程类的对象
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//.................................................
}
主线程中在某些事件触发下执行下句来执行线程操作:
synchronized (this) {
notify();
}
该线程在主线程类初始化时启动,之后线程一直处于wait状态(直到触发事件),现在想知道如果主线程退出时,怎样结束处于wait状态的该线程

解决方案 »

  1.   

    更正一下,先前的//.......应该放置在whlie循环中。
    当然处理方式我可以再加一个标志位,用于控制//...........代码的操作:
    while (!flag) {
        synchronized (object) {
            try {
                object.wait();//object为主线程类的对象
            } catch (InterruptedException e) {}
        }    if (condition) {
            //..........
        } else{
            flag = ture;
        }
    }
    之后在主线程退出事件中写:
    synchronized (this) {
        condition = false;
        notify();
    }
    唤醒线程运行,在操作主体上通过条件控制不让其执行,且改变while的条件,使之不再运行,从而结束run(),当然上述只是一个想法之一,不知大家有没有更好的方法
      

  2.   

    我来了,“第四”个。不过……好像……你这不是已经给出解决方案了吗?我想不出什么更好的办法了,hehe
      

  3.   

    可是我这样改是不是麻烦点,直接调用线程对象的方法来结束其运行可不可以(有什么方法),就向完成SUN不推荐使用的Thread.stop()来释放它已经锁定的所有监视器对象
      

  4.   

    :),是没有几行代码写,我甚至知道自然结束的好处,在这个问题中,我想了解的一点是,直接在主线程里调用该线程对象的interrupt()方法来结束其运行,不知可否,maquan兄给个说法吧!
      

  5.   

    不敢不敢,我对线程用得不多,理解也不深,知识基本限于 API 文档。从 API 文档看,这个 interrupt() 从使用效果上跟 notify() 差不多吧?或者说,跟 notifyAll() 更像。……
      

  6.   

    这是我从一篇文章上看到的
        如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
        需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。所以试想在我的代码用类似的方法来结束线程,不知可有不妥!
      

  7.   

    把此线程设置为后台线程 setDaemon(true)
      

  8.   

    守护程序处理起来比较简单,但是由于其级别最低,况且结束的太突然,不可以处理太复杂的逻辑,例如有访问数据库的操作的话,难以保证释放资源。interrupt用来中止阻塞状态,不仅仅是wait。
    notify一般和wait配对使用。对于你的程序我觉得用什么无所谓了,不过在使用interrupt或者notify时,还是要处理好判断条件。