Java 输出和输出的SwingWorker;工作,还是每人一个?

Java 输出和输出的SwingWorker;工作,还是每人一个?,java,swing,swingworker,secondaryloop,Java,Swing,Swingworker,Secondaryloop,目前,我总是创建一个SwingWorker来完成我的实际工作,另一个通过PipedReader处理输出 我很想把两者结合起来,但在我的情况下,我看不到一个简单的方法 鉴于我: 有一个可以工作的预制对象(converter,在本例中) 要定期向GUI显示转换器的进度更新吗 当converter完成任务并返回时接收对象 有没有一种方法可以做到这一点,而不需要两个骗子 编辑:请注意,制作converterextendSwingWorker不是一个选项 编辑2:回应下面的评论。这是一个更大的GUI应用程

目前,我总是创建一个
SwingWorker
来完成我的实际工作,另一个通过
PipedReader
处理输出

我很想把两者结合起来,但在我的情况下,我看不到一个简单的方法

鉴于我:

  • 有一个可以工作的预制对象(
    converter
    ,在本例中)
  • 要定期向GUI显示转换器的进度更新吗
  • converter
    完成任务并返回时接收对象
  • 有没有一种方法可以做到这一点,而不需要两个骗子

    编辑:请注意,制作
    converter
    extend
    SwingWorker
    不是一个选项

    编辑2:回应下面的评论。这是一个更大的GUI应用程序的一部分,处理大块数据(以txt的形式),并通知用户哪里出了问题,或者已经决定了什么

    示例代码(仅用于说明,未使用):


    如果使用一个或两个
    SwingWorker
    ,我想让这些事情复杂化,这并不是对你问题的回答

    • 我建议看一下和真实的相同的代码

    • Executor
      不关心
      SwingWorkers
      生命周期,反之亦然

    @用户1291492处理30 mb文本文件

    • 你必须,特别是阅读

    • 您必须(
      处理30 mb文本文件
      )来实现一些
      批处理
      ,例如,每10个循环将数据发布到GUI,然后将立即输出到GUI

    • 在批处理期间,可以通过S
      wingWorker#cancel()停止当前线程


    如果您使用JDK7,您可以考虑使用链接来代替多个SWIFGER实例。 SecondaryLoop本质上允许您等待后台线程(或一系列线程)完成而不阻塞EDT,类似于SwingWorker。在任何情况下,它可能都不适合作为SwingWorker的替代品,但是根据对您问题的描述,听起来这是您可以使用的


    有关此主题的更多讨论,请查看相关问题“

    为什么您需要一个swingWorker?这会影响用户界面吗?@user1291492是的。处理30MB的文本文件,让用户看到所做的决定。谢谢!这看起来是一个很好的解决方案。我将尝试实施它
    //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());
       }
    }