线程的run()方法中有一个循环体:
public void run() {
while (!flag) {
synchronized (object) {
try {
object.wait();//object为主线程类的对象
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//.................................................
}
主线程中在某些事件触发下执行下句来执行线程操作:
synchronized (this) {
notify();
}
该线程在主线程类初始化时启动,之后线程一直处于wait状态(直到触发事件),现在想知道如果主线程退出时,怎样结束处于wait状态的该线程
public void run() {
while (!flag) {
synchronized (object) {
try {
object.wait();//object为主线程类的对象
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//.................................................
}
主线程中在某些事件触发下执行下句来执行线程操作:
synchronized (this) {
notify();
}
该线程在主线程类初始化时启动,之后线程一直处于wait状态(直到触发事件),现在想知道如果主线程退出时,怎样结束处于wait状态的该线程
当然处理方式我可以再加一个标志位,用于控制//...........代码的操作:
while (!flag) {
synchronized (object) {
try {
object.wait();//object为主线程类的对象
} catch (InterruptedException e) {}
} if (condition) {
//..........
} else{
flag = ture;
}
}
之后在主线程退出事件中写:
synchronized (this) {
condition = false;
notify();
}
唤醒线程运行,在操作主体上通过条件控制不让其执行,且改变while的条件,使之不再运行,从而结束run(),当然上述只是一个想法之一,不知大家有没有更好的方法
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。所以试想在我的代码用类似的方法来结束线程,不知可有不妥!
notify一般和wait配对使用。对于你的程序我觉得用什么无所谓了,不过在使用interrupt或者notify时,还是要处理好判断条件。