gpt4 book ai didi

java - 为什么即使在使用 SwingUtilities.invokeLater 后我的 GUI 仍然挂起?

转载 作者:搜寻专家 更新时间:2023-10-31 08:08:40 24 4
gpt4 key购买 nike

我有一个在 EDT 中调用的 ActionListener。我的 plot() 函数计算量很大,很容易需要五秒钟。它使 GUI 按预期挂起。我添加了 SwingUtilities.invokeLater 代码,但它仍然挂起。既然我正在为我的升沉计算生成一个单独的线程,GUI 不应该响应吗?

final ActionListener applyListener = new ActionListener() 
{
@CommitingFunction
public void actionPerformed(ActionEvent arg0)
{
/*Don't do plotting in the EDT :)*/
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
plot();
}
});
}
};

最佳答案

完全没有。 InvokeLater 没有生成新线程。 invokeLater exists to tell Swing explicitly "use the Event Dispatching Thread for this, but not right now". invoke 和 invokeLater 的存在是为了让您执行仅对来自其他线程的事件调度线程安全的操作 - 不是通过在这些线程上执行它们,而是通过告诉 EDT 执行它们。

您的 ActionListener 将运行得非常快,将 Runnable 扔到 Swing 的事件调度队列中。然后当它到达那么远时,运行 plot() 将需要五秒钟。

唯一的解决方法是重构 plot()。使用 SwingWorker (或类似的多线程策略,但 SwingWorker 可能是最好的)将 plot() 的逻辑实际移动到不同的线程上。该线程不能安全地绘制任何东西,因为它不是 Swing 事件调度线程,因此它的所有绘制操作都需要通过 invokeLater() 执行。出于效率原因,您应该尝试使用从计算中存储的结果在一个 invokeLater() 上一次执行所有绘图操作。

关于java - 为什么即使在使用 SwingUtilities.invokeLater 后我的 GUI 仍然挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4227745/

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