为什么后台线程应该运行然后在一秒钟内停止?它应该永远运行吗?

时间:2016-07-13 03:05:44

标签: java multithreading concurrency

我在第66项中读到了名为 Effective Java 2 的书,它说后台线程将永远运行并永不停止。但是,当我在计算机中运行代码时,它会在一秒钟内停止运行?怎么了?它是计算机缓存问题吗?

public class StopThread {
  private static boolean stopRequested;

  public static void main(String[] args)
        throws InterruptedException {
    Thread backgroundThread = new Thread(new Runnable() {
      public void run() {
        int i = 0;
        while (!stopRequested) {
          i++;
          System.out.println(i+";");
        }
      } 
    });
    backgroundThread.start(); 
    TimeUnit.SECONDS.sleep(1);
    stopRequested = true;
  }
}

这些书建议使用Synchronizevolatile,但我尝试发现即使我不使用该建议,它也会在我的计算机中运行一秒钟。但是永远在我的室友身边跑。他说这是缓存配置的原因。

谁能告诉我原因?

2 个答案:

答案 0 :(得分:4)

有效Java的作者Bloch所说的是" 在没有同步的情况下,无法保证何时,如果有的话,后台线程会看到值中的变化停止 - 请求 [SIC]"。

也就是说,它可能会立即停止。或者它可能在短时间后停止。或者它永远不会停止。 必需永远不会运行。就此而言,甚至不需要编译器来移除同步。但它可以。而且很可能。所以你就是那里" volatile"关键字来了。

答案 1 :(得分:0)

您在原始示例中添加了一行:

System.out.println(i+";");

PrintStream.println(String)包含synchronized块,其对volatile具有类似的内存一致性效果。