gpt4 book ai didi

java - Future.get() 是 Thread.join() 的替代品吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:32:17 26 4
gpt4 key购买 nike

我想编写一个永远运行的命令行守护进程。我知道如果我希望 JVM 能够在 linux 中正常关闭,则需要通过一些 C 代码包装 Bootstrap 。我想我现在可以使用关闭 Hook 。

关于我的问题:

  1. 我的 main(String[]) block 将启动一个单独的 Superdaemon。
  2. Superdaemon 将永远轮询和循环。

所以通常我会这样做:

class Superdaemon extends Thread { ... }

class Bootstrap
{
public static void main( String[] args )
{
Thread t = new Superdaemon();
t.start();

t.join();
}
}

现在我想如果我通过 Executor 启动 Superdaemon,我可以做到

Future<?> f = exec.submit( new Superdaemon() );

f.get();

Future.get() 是用 Thread.join() 实现的吗?如果不是,它的行为是否等效?

问候,

足下

最佳答案

是的,你写这些的方式是等价的。

但是,您实际上并不需要等待 Superdaemon 线程完成。当主线程执行完 main() 时,该线程退出,但 JVM 不会。 JVM 将一直运行,直到最后一个非守护线程退出其运行方法。

例如,

public class KeepRunning {
public static void main(String[] args) {
Superdaemon d = new Superdaemon();
d.start();
System.out.println(Thread.currentThread().getName() + ": leaving main()");
}
}

class Superdaemon extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName() + ": starting");
try { Thread.sleep(2000); } catch(InterruptedException e) {}
System.out.println(Thread.currentThread().getName() + ": completing");
}
}

你会看到输出:

main: leaving main()
Thread-0: starting
Thread-0: completing

换句话说,主线程先完成,然后辅助线程完成,然后 JVM 退出。

关于java - Future.get() 是 Thread.join() 的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/617591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com