gpt4 book ai didi

java - 为什么Java在进入无限循环时会挂起主线程?

转载 作者:行者123 更新时间:2023-11-30 03:30:04 25 4
gpt4 key购买 nike

我的代码有一个更新 boolean 变量的 UI 线程。我遇到的问题是我希望主程序在变量变为 true 时继续执行。

public static void main(String[] args) throws Exception{
//Display the UI by creating an instance of Node
Node node = new Node();

//Wait for the node to connect to a router before continuing
while(!isConnectedToRouter);

//Do other things
}

在调试时,我注意到主线程会自行挂起,因此 main 永远不会“做其他事情”。即使在另一个线程使 boolean 值 isConnectedToRouter 为 true 之后。如果我将 while 循环更改为

//Wait for the node to connect to a router before continuing
while(!isConnectedToRouter){
Thread.sleep(1);
}

它有效,但它让我意识到我做错了什么。任何帮助将不胜感激。

最佳答案

比忙等待更好的是在主线程中 hibernate ,直到需要继续。

java.util.concurrent具有用于线程的高级接口(interface),更易于安全使用并适合大多数情况。

正在等待使用 CountDownLatch例如可以这样做:

CountDownLatch latch = new CountDownLatch(1);

,该对象应该在主线程和工作线程中可见。需要使用相同对象进行锁定。

在主线程中等待:

latch.await();

当另一个线程准备好时:

latch.countDown();

此实现的优点是您无需担心工作线程在等待阶段开始之前已准备就绪的情况。在这种情况下,await() 会做正确的事情并立即返回。

在这种情况下,也可以使用 Object 中的旧低级方法,但需要特别注意处理工作线程在主线程等待之前准备就绪的情况 - 无需检查这样很容易锁定主线程。因此,我建议坚持使用 java.util.concurrent,除非您有充分的理由不这样做。这些类的存在是为了帮助编写安全的线程代码。

注意:为了简洁起见,我省略了处理 InterruptedExceptions 的代码 - 这应该使用 latch.wait()Object.wait 来完成()

关于java - 为什么Java在进入无限循环时会挂起主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29266040/

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