我有一个在构造函数中构建GUI的程序。我需要一个与EDT分开的线程,以便在构造对象之后立即运行。谁能给我指个正确的方向?
我需要一个与EDT分开的线程
线程与EDT是分开的,所以你所要做的就是创建一个Runnable,然后启动它。
你只需要担心线程是否更新任何GUI组件。如果是这种情况,那么你可能需要使用SwingWorker。要了解更多信息,请阅读Swing教程中的并发部分。
您要使用的是SwingWorker<T,V>。在doInBackground
方法中,打开连接并开始获取数据。当您有足够的数据来更新gui时,调用publish
方法。实现process
方法,用publish
的新数据更新gui,最后,实现done
方法,当你完成获取数据时通知用户。
Swing Worker是一个泛型,所以当你构造它时,你需要提供两个类型:T
和V
。V
是publish
和process
方法之间传递的数据类型,T
是doInBackground
返回并传递给done
的数据类型。
构建您的GUI并在一个新的Runnable中打开一个新窗口,该Runnable由:swingutility . invokelater调用
你有两个选择
1)将线程包装成可运行的
2)我对普通的SwingExecutor不太满意,然后我使用该Executor和SwingWorker,由PropertyChangeListener监视,例如这里的
请注意Executor启动的线程数。Executor并不关心SwingWorker是否结束,但仍然存在一个Bug,它很有可能使Executor在同一时间内最大限度地(在API的某个地方)同时运行的任务过载。
因此有可能实现PropertyChangeListener