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

如何将Java中的线程挂在一行中?

  •  6
  • rui  · 技术社区  · 15 年前

    (我基本上需要这个来维持程序。主线程注册在不同线程中运行的回调侦听器。我只需要主线程永远挂起,让其他线程完成它们的工作)

    10 回复  |  直到 15 年前
        1
  •  12
  •   Rob Napier    11 年前

    有几件事你可以做,比永远挂起最初的线程更好:

    1. 使用 otherThread.join() . 这将导致正在运行的当前线程休眠,直到另一个线程完成执行。
    2. 正如@nanda所建议的,使用 ExcecutorService.shutdown() 等待线程池完成。
    3. 使用 otherThread.setDaemon(false) 让你的初始线程退出。这会将新线程设置为用户线程。只有在守护进程线程运行时,Java才会关闭。
        2
  •  13
  •   Bozho    15 年前
    synchronized(this) {
        while (true) {
            this.wait();
        }
    }
    

    (感谢卡洛斯·赫伯格。上述代码中省略了异常处理)

    notify() ,或者永远。

        3
  •  6
  •   Tim Bender    15 年前

    Thread.sleep(Long.MAX_VALUE);

    好吧,所以它不是永远的,但是谈论一个非常长的时间:)

        4
  •  5
  •   nanda    15 年前

    使用执行器。通过使用方法shutdown(),您将强制执行器等待所有线程完成。

        5
  •  4
  •   Redlab    15 年前

    用一个 CountDownLatch 你可以等到倒计时到0,如果你确保它从不倒计时,也许只有在它需要结束的时候(这也会导致0%的cpu,与将永远运行的循环相反,使用join()时,当所有其他线程完成时,应用程序仍将完成,executor的选项更好,但也会在所有已执行任务完成时结束)

        6
  •  3
  •   NG.    15 年前

    你可以用 thread.join 等待所有线程。

        7
  •  1
  •   Eamonn O'Brien-Strain    9 年前

    这里有一个解决方案,是一个线性,因为你只需要添加一个额外的行(你必须加上 synchronized throws InterruptedException 给你的 main 另外,它不需要访问,甚至不需要了解您正在使用的库中的线程。

    public static synchronized void main(String[] args) throws InterruptedException{
      ...
      YourMainClass.class.wait();  // wait forever
    }
    

    它假设你永远不会打电话 notify 如果你得到一个 InterruptedException . (您可以添加 while (true) { ... } 周围 wait 如果你真的想防范的话,那就行。)

        8
  •  0
  •   Steve McLeod    15 年前
    public static void main(String[] args) {
        Thread t = new Thread() {
            @Override
            public void run() {
                try {
                    while (true) {
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                }
            }
        };
        t.setDaemon(false);
        t.start();
    }
    
        9
  •  0
  •   Nathan Garabedian    13 年前

        10
  •  -1
  •   Matthew Flaschen    15 年前
    for(;;);
    

    但你不太可能想要挂线。相反,您应该考虑加入其他线程之类的选项。