我有这样的代码
boolean start = false;
ThreadX a = new ThreadX();
a.start();
start = true;
Class ThreadX extends Thread {
public void run() {
while (start == true) {
...
}
}
}这段代码有问题吗?我已经执行了这段代码,没有看到任何问题,只是想知道线程是否会启动,并且永远不会执行start = true
发布于 2011-08-20 08:01:16
有两个问题:
首先,理论上线程可以在start设置为true之前启动,因此可以在start设置为true之后终止线程,但由于缺乏内存屏障,永远不要设置start
AtomicBoolean.
等java.util.concurrent.atomic中的一种AtomicXXX类型
同样,作为一个好的实践,你应该实现Runnable而不是扩展Thread -你不想改变一个线程的基本行为,你只想给它提供一个任务。(您可以通过扩展线程来实现这一点,这是一个设计缺陷。)
发布于 2011-08-20 08:00:50
是的,确实有个问题。
假设start是一个局部变量,因为内部类中使用的所有局部变量都必须为final,所以这段代码甚至不会编译。
假设start是某个类的字段。然后必须将该字段声明为volatile,否则不能保证如果一个线程更改了该变量,其他线程也会看到该更改。
发布于 2011-08-20 08:01:09
这取决于start是在run()开始之前还是之后变为真。我之所以说“视情况而定”,是因为JVM不能保证这两种情况都会发生。当然,这是假设start在线程实例的作用域内。
https://stackoverflow.com/questions/7128552
复制相似问题