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