代码之家  ›  专栏  ›  技术社区  ›  ksl

使用Thread.currentThread()。Java中的join()

  •  16
  • ksl  · 技术社区  · 10 年前

    以下代码取自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新手,我的理解是,这将阻止当前线程(在本例中是主线程)的执行,并有效地使其死锁。i、 e.它将导致当前(主)线程阻塞,直到当前(主线程)结束,这将永远不会发生。

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

    3 回复  |  直到 10 年前
        1
  •  25
  •   assylias    10 年前

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

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

    另一种选择是使用 Thread.sleep(Long.MAX_VALUE); .

        2
  •  9
  •   Peter Lawrey    10 年前

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

    只有当没有非守护进程线程运行时,这才是正确的。这在这里可能是正确的,但通常IMHO最好让后台线程“等待”非dameon,并让主线程在无事可做时退出。我看到开发商把 Thread.sleep() 包裹在无限循环中。等

        3
  •  3
  •   Solomon Slow    10 年前

    这是一个例子。这只是一个不太好的例子。

    他们试图向你展示如何制作一个永远运行的线程。

    Thread.currentThread().join(); 是一个需要永远才能完成的陈述。你应该用你自己的代码来代替它,它可以永远运行,而且可以做一些有用的事情。