在 Java 中使用 Thread.currentThread().join()

2022-09-03 04:19:43

以下代码取自泽西岛项目中的一个示例。请参阅此处

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新手,我的理解是,这将阻止当前线程(在本例中为主线程)的执行,并有效地将其死锁。也就是说,它将导致当前(主)线程阻塞,直到当前(主)线程完成,这永远不会发生。

这是正确的吗?如果是这样,为什么会这样?


答案 1

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

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

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


答案 2

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

仅当没有非守护程序线程运行时,才如此。这里可能是正确的,但通常恕我直言,最好是让后台线程这个主线程“等待”非damon,并在没有任何事情可做时让主线程退出。我看到开发人员被包装在一个无限循环中。等。Thread.sleep()