Java线程运行
我有这样的代码Java线程运行,java,Java,我有这样的代码 boolean start = false; ThreadX a = new ThreadX(); a.start(); start = true; Class ThreadX extends Thread { public void run() { while (start == true) { ... } } } 这
boolean start = false;
ThreadX a = new ThreadX();
a.start();
start = true;
Class ThreadX extends Thread {
public void run() {
while (start == true) {
...
}
}
}
这个代码有问题吗?我已经执行了这个,没有看到任何问题,只是想知道线程是否会启动,并且永远不会执行start=true是的,有问题 假设
start
是一个局部变量,此代码甚至不会编译,因为内部类中使用的所有局部变量都必须是final
假设
start
是某个类的字段。然后该字段必须声明为volatile,否则不能保证如果一个线程更改变量,其他线程会看到该更改。是的,存在问题
假设start
是一个局部变量,此代码甚至不会编译,因为内部类中使用的所有局部变量都必须是final
假设
start
是某个类的字段。然后必须声明该字段为volatile,否则不能保证如果一个线程更改变量,其他线程会看到该更改。这取决于start
在run()
开始之前或之后是否变为true。我说“视情况而定”,因为JVM不能保证这两种情况都会发生。当然,这是假设start
在线程实例的范围内。这取决于start
在run()开始之前还是之后变为true。我说“视情况而定”,因为JVM不能保证这两种情况都会发生。当然,这是假设start
在线程实例的范围内。有两个问题:
- 首先,理论上线程可以在
start
设置为true之前启动,并因此立即终止
- 其次,理论上,线程可以在
start
设置为true后启动,但由于缺少内存障碍,因此从不设置start
change的值(假设它在原始线程的某个位置被设置为false)。使变量可变、使用锁或使用java.util.concurrent.atomic中的AtomicXXX
类型之一,例如
此外,为了获得良好的实践效果,您应该实现Runnable
,而不是扩展Thread
——您不想更改线程的基本行为,只想为它提供一个任务。(事实上,您可以扩展线程来执行此操作是一个设计缺陷。)有两个问题:
- 首先,理论上线程可以在
start
设置为true之前启动,并因此立即终止
- 其次,理论上,线程可以在
start
设置为true后启动,但由于缺少内存障碍,因此从不设置start
change的值(假设它在原始线程的某个位置被设置为false)。使变量可变、使用锁或使用java.util.concurrent.atomic中的AtomicXXX
类型之一,例如
此外,为了获得良好的实践效果,您应该实现Runnable
,而不是扩展Thread
——您不想更改线程的基本行为,只想为它提供一个任务。(事实上,您可以扩展线程来执行此操作是一个设计缺陷。)因此,不能保证循环会进入:
如果线程已启动且当前线程(启动另一个线程的线程)被中断,则另一个线程可以运行,而while条件将为false,运行将退出
另一方面,如果当前线程没有中断,并将start设置为true,则循环将进入
这被称为竞争条件,因此不能保证循环会进入:
如果线程已启动且当前线程(启动另一个线程的线程)被中断,则另一个线程可以运行,而while条件将为false,运行将退出
另一方面,如果当前线程没有中断,并将start设置为true,则循环将进入
这称为竞争条件线程将启动,但可能会立即退出、稍后退出或永远运行:
场景1-永远运行
在thread run()进入之前,start被更新为true,jvm决定将其写入内存,以便创建的线程将其视为true,并且永远不会终止
场景2-立即退出
在run()启动之前,start更新为true,但jvm不更新物理内存(无membar),然后run继续运行并看到false,并将终止,或者run()和循环在start=true运行之前第一次运行
场景3-在某个点退出
在run()之前或run()之后,start会更新,但jvm会在run()之后的某个时间点更新物理内存,并进行多次迭代。线程将启动,但可能会立即退出、稍后退出或永远运行:
场景1-永远运行
在thread run()进入之前,start被更新为true,jvm决定将其写入内存,以便创建的线程将其视为true,并且永远不会终止
场景2-立即退出
在run()启动之前,start更新为true,但jvm不更新物理内存(无membar),然后run继续运行并看到false,并将终止,或者run()和循环在start=true运行之前第一次运行
场景3-在某个点退出
运行前()或运行后()启动会更新,但jvm会在运行后的某个时间点更新物理内存,并进行多次迭代。将扩展线程
替换为扩展可运行
@Eng:你的意思是实现可运行
。而且@Eng,线程已经实现了可运行,所以OP在这方面没有问题,但是还有其他问题(例如,start应该是易变的)。如果您的代码实际上是正确的Java,那么给出一个好的答案会更容易…用e替换extend-Thread