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

标签 java multithreading concurrency

<分区>

我看过Effective Java 2这本书第66条,里面说后台线程会一直运行,永不停止。但是当我在我的计算机中运行代码时,它会在一秒钟内停止?怎么了?是不是电脑缓存问题?

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,但我尝试发现即使我不使用该建议,它也会在我的计算机中运行一秒钟。但是在我的室友中永远奔跑。他说是缓存配置的原因。

谁能告诉我原因?

最佳答案

Effective Java 的作者 Bloch 所说的是“在没有同步的情况下,无法保证后台线程何时(如果有的话)看到值 stop-Requested 的变化 [原文如此]”。

也就是说,它可能会立即停止。或者它可能会在短时间后停止。或者它可能永远不会停止。 不需要永远运行。就此而言,编译器甚至不需要删除同步。但它可以。而且很有可能。因此,这就是“volatile”关键字的用武之地。

关于java - 为什么后台线程应该运行然后在一秒钟内停止?它应该永远运行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342010/

相关文章:

java - 寻找类似于 Hyperic SIGAR 的商业或免费库

libGDX 中的 java 线程

java - "Clean"中断可能正在做某事的线程的方法

java - jersey Rest api 和 org.reSTLet api 之间的区别

java - Java中的互斥方法执行

azure - Azure Function 与 .Net 5 中的并发(隔离)

perl DBI 和准备好的语句名称冲突

c# - System.IO.IOException : 'The process cannot access the file ' @. txt'因为它正被另一个进程使用。'

java - Android Studio gradle版本错误

C# Windows 窗体线程 : My form seems not to run as own thread