目前,我始终创建SwingWorker
来完成我的实际工作,而另一个则通过PipedReader
创建输出。
我喜欢将两者结合起来,但在我的情况下,我只是看不到一种简单的方法。
鉴于我:
converter
)converter
到GUI的进度的更新converter
完成任务并返回时收到一个对象。如果没有两个SwingWorkers,有没有办法做到这一点?
修改:请注意,converter
扩展SwingWorker
不是一种选择。
编辑2:回应下面的评论。这是一个更大的GUI应用程序的一部分,处理大块数据(以txt的形式)并告知用户什么是错的,或者已经决定了什么。
示例代码(纯粹是说明性的,未使用):
//SwingWorker 1
@Override
protected Void doInBackground() {
outputWorker.useInStream(new PipedReader(outStream));
outputWorker.execute();
converter.usePipedWriter(outStream);
Output object2=converter.Convert(object1);
}
//SwingWorker 2
@Override
protected Void doInBackground() {
while(inStream.hasNext()) {
publish(inStream.next());
}
}
答案 0 :(得分:2)
SwingWorker
,不是您问题的答案,我想让这些事情变得复杂......
我建议查看Executor that invoke SwingWorker以及与真实visualisations / output to the GUI相同的代码
Executor
并不关心SwingWorkers
生命周期,反之亦然
@ user1291492处理30 MB文本文件
您必须listening for exception(s) from methods get()
,特别是阅读answer by @trashgod
你必须(Processing 30 mb text files
)实现一些Batch
,例如你每隔10个浏览器向GUI发布数据,然后立即输出到GUI
Batch
期间可以通过S wingWorker#cancel();
停止当前线程
答案 1 :(得分:1)
如果您使用的是JDK7,则可以考虑使用SecondaryLoop而不是将多个SwingWorker实例链接在一起。
SecondaryLoop本质上允许您等待后台线程(或一系列线程)完成而不会阻止EDT,类似于SwingWorker。在每种情况下,它可能不适合作为SwingWorker的替代品,但是根据您对问题的描述,听起来这可能是您可以使用的。
有关此主题的更多讨论,请查看相关问题“SecondaryLoop instead of SwingWorker? ”