首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java线程运行

Java线程运行
EN

Stack Overflow用户
提问于 2011-08-20 07:54:41
回答 5查看 1K关注 0票数 1

我有这样的代码

代码语言:javascript
复制
  boolean start = false;
  ThreadX a = new ThreadX();
  a.start();
  start = true;

  Class ThreadX extends Thread {

          public void run() {
              while (start == true) {
                ...
              }

          } 
  }

这段代码有问题吗?我已经执行了这段代码,没有看到任何问题,只是想知道线程是否会启动,并且永远不会执行start = true

EN

回答 5

Stack Overflow用户

发布于 2011-08-20 08:01:16

有两个问题:

首先,理论上线程可以在start设置为true之前启动,因此可以在start设置为true之后终止线程,但由于缺乏内存屏障,永远不要设置start

  • 的值(假设它在原始线程中的某个位置设置为false )。或者使变量成为易失性变量,使用锁,或者使用AtomicBoolean.

等java.util.concurrent.atomic中的一种AtomicXXX类型

同样,作为一个好的实践,你应该实现Runnable而不是扩展Thread -你不想改变一个线程的基本行为,你只想给它提供一个任务。(您可以通过扩展线程来实现这一点,这是一个设计缺陷。)

票数 6
EN

Stack Overflow用户

发布于 2011-08-20 08:00:50

是的,确实有个问题。

假设start是一个局部变量,因为内部类中使用的所有局部变量都必须为final,所以这段代码甚至不会编译。

假设start是某个类的字段。然后必须将该字段声明为volatile,否则不能保证如果一个线程更改了该变量,其他线程也会看到该更改。

票数 3
EN

Stack Overflow用户

发布于 2011-08-20 08:01:09

这取决于start是在run()开始之前还是之后变为真。我之所以说“视情况而定”,是因为JVM不能保证这两种情况都会发生。当然,这是假设start在线程实例的作用域内。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7128552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档