(请务必阅读下面的编辑,这个问题显然令人困惑,我很抱歉)
这是一个典型的SwingUtilities.invokeLater
调用:
SwingUtilities.invokeLater( new Runnable() {
public void run() {
...
}
} );
现在我想要一个SwingUtilities.invokeNowOrLaterIfEDT
.
当然,我可以使用自己的实用程序类,如下所示:
public static void invokeNowOrLaterIfEDT( @NotNull Runnable r ) {
if ( SwingUtilities.isEventDispatchThread() ) {
Thread t = new Thread( r );
t.start();
} else {
r.run();
}
}
但这有一个缺点,即每次从 EDT 调用它时都会创建一个新线程(并且必须等待该新线程被调度)。
另一种方法是使用一个在应用程序生命周期期间运行的额外线程(可以延迟实例化),使用一些阻塞队列将Runnables
. 这样做的好处是,每次我从 EDT 调用这样的方法时,都不会经常创建线程。
默认 Java API 中是否存在类似的内容?
什么会更好:每次从 EDT 调用它时只需创建一个新线程,就像上面的示例一样,或者有一个额外的线程在Runnables
EDT 之外执行,或者其他什么?
编辑:就像SwingUtilities.invokeLater
可能会或可能不会从 EDT 调用一样,我想到的方法可能会或可能不会从 EDT 调用。它是执行完全异步的操作,可能会或可能不会从 GUI / EDT 上的用户操作触发。我认为SwingUtilities.invokeLater
能够在 EDT 中运行某些东西非常方便,而无需关心是否在 EDT 上调用它。而且我认为invokeNowOrLaterIfEDT(...)
我上面展示的非常方便。但我可能错了。对这种方法的需要是疯狂的吗?现在我开始怀疑了!?
编辑二:我一点都不清楚,我意识到这一点,对此感到抱歉。我想从 EDT 异步运行的东西不是超长的过程,也不需要像进度条这样的更新或任何显示正在发生的事情的东西。如果它是单线程/排队的也不是问题(显然,我在问题中说明了它)。我根本不是在使用线程池来有效地将负载分散到各种内核等上。只是这些是不需要在 EDT 上运行的小型计算,并且可以从 EDT 调用或不调用。这实际上只是我想在 EDT 之外执行的微小的异步内容。如果它们都在同一个线程上排队等,这不是问题。
但是现在,多亏了你的回答,我也意识到,如果这样的事情是使用单线程和 Runnable 队列实现的,那么通过调用这样一个用于长时间计算的实用方法将很容易自取其辱然后全部排队而不是正确地多线程。