gpt4 book ai didi

java - 通过 ExecutorService 执行 Thread 时 Thread.join() 不起作用

转载 作者:行者123 更新时间:2023-12-02 05:40:10 25 4
gpt4 key购买 nike

这是我的代码:

public static void main(String[] args) {
System.out.println("program started");
ExecutorService executor = Executors.newCachedThreadPool();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread finished");
}
});
executor.execute(thread);
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread joined");

}

当我启动我的线程时,如上所示,thread.join() 不起作用,并且它不会等待线程完成。我需要通过 ExecutorService 执行我的线程,并等待该线程完成。但我的代码不能很好地工作。谁能帮我吗?

为什么我不使用Future而不是Thread

因为有时我需要中断我的线程并等待该线程完成。但是当我取消 Future 时,future.get() 会收到异常,并且不会等待它的 Thread 完成。

如果我的句子语法不正确,我提前道歉。因为我英语说得不好。

最佳答案

简单的答案:不要这样做。

不要像这样混合抽象层。 Executor 接口(interface)没有 execute() 线程。它需要Runnables。向其传递 Thread 对象并不重要,除了调用 run() 方法之外,您的线程根本不会被使用。

将“低层”裸铁线程与抽象的执行器服务混合起来根本就是一个坏主意。

线程池概念的全部要点是您尝试控制底层线程。等待池线程结束是没有意义的。结束。线程池保留线程,因为建立线程是一个(相对)昂贵的操作。所以他们不会结束,而是继续生活,在未来做其他工作。

真正的答案是:要么不使用该执行程序服务,要么寻找适合该概念的解决方案(无需您在旁边做一些低级的事情)。

“真正的”答案:退后一步,告诉我们您打算通过这种方式解决的“真正”的问题。

关于java - 通过 ExecutorService 执行 Thread 时 Thread.join() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51841123/

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