【问题标题】:Use of Thread.currentThread().join() in Java在 Java 中使用 Thread.currentThread().join()
【发布时间】:2016-01-06 08:55:27
【问题描述】:

以下代码取自 Jersey 项目中的示例。见here

public class App {

    private static final URI BASE_URI = URI.create("http://localhost:8080/base/");
    public static final String ROOT_PATH = "helloworld";

    public static void main(String[] args) {
        try {
            System.out.println("\"Hello World\" Jersey Example App");

            final ResourceConfig resourceConfig = new ResourceConfig(HelloWorldResource.class);
            final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(BASE_URI, resourceConfig, false);
            Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
                @Override
                public void run() {
                    server.shutdownNow();
                }
            }));
            server.start();

            System.out.println(String.format("Application started.\nTry out %s%s\nStop the application using CTRL+C",
                    BASE_URI, ROOT_PATH));

            //////////////////////////////
            Thread.currentThread().join();
            //////////////////////////////

        } catch (IOException | InterruptedException ex) {
            //
        }

    }
}

我了解除了使用Thread.currentThread().join(); 之外的情况。

我是 Java 新手,我的理解是这将阻止当前线程(在本例中为主线程)的执行,并有效地将其死锁。即它将导致当前(主)线程阻塞,直到当前(主)线程完成,这永远不会发生。

这是正确的吗?如果有,为什么会在那里?

【问题讨论】:

  • 从日志信息中可以看到服务器已经启动,主线程会一直等到没有收到中断信号,
  • Use of Thread.currentThread().join() 完全、完全、完全没有意义,并且是一个错误。删除。

标签: java multithreading jersey jersey-2.0


【解决方案1】:

Thread.currentThread().join() 永远阻塞当前线程。在您的示例中,这会阻止 main 退出,除非程序被杀死,例如在 Windows 上使用 CTRL+C。

如果没有该行,main 方法将在服务器启动后立即退出。

另一种方法是使用Thread.sleep(Long.MAX_VALUE);

【讨论】:

  • 或者让后台线程“等待”非守护线程。
  • 所以 CTRL+C 会导致在另一个线程上调用关闭挂钩,从而关闭服务器,然后程序终止?没有主线程运行完成?
  • @PeterLawrey 确实 - 在这种情况下,我怀疑该线程是一个守护线程,您无法更改它 - 但我不知道这个特定的库。
【解决方案2】:

如果main线程退出,程序就会退出,这是一个常见的误解。

只有在没有非守护线程运行时才适用。这在这里可能是真的,但恕我直言,通常最好让这个主线程“等待”非 dameon 的后台线程,并在它无事可做时让主线程退出。我看到开发人员将Thread.sleep() 包裹在一个无限循环中。等等

【讨论】:

    【解决方案3】:

    这是一个例子。这不是一个很好的。

    他们试图向您展示如何创建一个永远运行的线程。

    Thread.currentThread().join(); 是一个需要永远完成的语句。您应该用自己的代码替换它,该代码可以永远运行,并且可能会做一些有用的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 2021-03-14
      相关资源
      最近更新 更多