java线程无法停止
为什么我的线程不能停止
class Threadz {
class runP implements Runnable {
int num;
private volatile boolean exit = false;
Thread t;
public runP() {
t = new Thread(this, "T1");
t.start();
}
@Override
public void run() {
while(!exit) {
System.out.println(t.currentThread().getName()+": "+num);
num++;
try {
t.sleep(200);
} catch(InterruptedException e) {}
}
}
public void stop() {
exit = true;
}
}
public static void main(String[] a) {
runP rp = new Threadz().new runP();
if(rp.num == 1) {rp.stop();}
}
}
如果我使用rp.num==0,线程可以立即停止。但是,为什么当我更改rp.num==x(x是任何大于0的数字)时线程不能停止?请帮我解决这件事。。。谢谢你的帮助
# 1 楼答案
检查
rp.num == 1
必须正好发生在rp.num
正好是一的点上,这是不太可能的在
main
方法中,您启动一个线程,该线程每200毫秒增加一次num
。之后,您将检查num == 1
,但这段代码的具体执行时间取决于许多您无法真正控制的因素(操作系统的调度等)。这可能在10毫秒之后(值为1),但也可能在300毫秒之后(值已经为2)。另外,线程何时准确启动也不确定。因此,您的线程也可能仅在测试之后启动。您可以用一个简单的print语句System.out.println(rp.num)
替换checkif(rp.num == 1) {rp.stop()};
来轻松测试这一点。如果您在打印之前再等待一段时间,您可能会更好地了解我所说的内容假设您想从外部阻止runnable,我建议使用类似Observer pattern的东西:
你的主要方法是
# 2 楼答案
我敢肯定,如果你多次运行这个程序,当程序真正停止运行时,就会出现这种情况
原因是在运行程序时,执行的机会要大得多
在
run()
方法中的num++
之前更改值然而,您可能会偶然遇到这样一种情况,即在主方法中的if语句之前执行run方法中的循环
确保发生这种情况的一种方法是持续检查以下情况:
例如
# 3 楼答案
在线程开始执行run方法之前执行下面的语句
添加线程。在执行上述语句之前执行sleep,它可以正常工作,因为它将在启动循环后执行此语句
我做到了>;1.进行测试
# 4 楼答案
因为此代码不是在线程的run()方法中执行的:
它与0一起工作,因为int的默认值为0。 但这并不一定在应用程序的所有执行中都是正确的,因为
runP
的线程可以在检查之前运行并增加num
:if (rp.num == 0)
在runP线程的run方法中移动停止条件: