代码之家  ›  专栏  ›  技术社区  ›  Molay

不会为每个发布()调用SwingWorker进程()

  •  0
  • Molay  · 技术社区  · 6 年前

    我不太会荡秋千。

    我在一个txt文件中有近200万条记录,需要逐个进程(基于拆分列)读取并将其推送到表中。完成整个过程大约需要4-5秒。

    我面临的问题是:JTable/UI正在等待所有200万条记录得到处理,然后一起显示。 是否有任何选项可以将记录推送到基于批处理或并行推送的JTable UI,比如一旦处理500条记录,我就可以将它们推送到UI?

    尝试使用SwingWorker实现,对每500条记录调用push()方法,但process()只对所有记录调用一次,而不是对每500条记录调用一次。如果我的方法错误,请纠正。

    new SwingWorker<Boolean, java.util.List<String>>() {
        @Override
        protected Boolean doInBackground() throws Exception {
    
            // Example Loop
            int i = 1;
            String line;
            java.util.List<String> list = new LinkedList();
            while ((line = in.readLine()) != null) {
                line = line.trim().replaceAll(" +", " ");
                list.add(line);
    
                if (i % 500 == 0) {
                    publish(list);
                    list = new LinkedList();
                }
                i++;
            }
    
            return true;
        }
    
        @Override
        protected void process(java.util.List<java.util.List<String>> chunks) {
            dtm.addRow(new String[]{"data"});
            System.out.println("Found even number: " + chunks.size());
        }
    }.execute();
    

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jean-Baptiste Yunès    6 年前

    Swing可以自由地将多个调用关联到 publish 到单个呼叫 process 正如医生所说:

    出版

    因为process方法是在事件上异步调用的 可能会对发布方法执行多个调度线程调用 在执行process方法之前。 出于性能目的,所有 这些调用合并为一个调用,并连接 参数 。 例如:

    publish("1");
    publish("2", "3");
    publish("4", "5", "6");
    

    可以 导致:

    process("1", "2", "3", "4", "5", "6")
    

    没有必要每500次迭代发布一次,只要一个结果可用就发布,并让Swing根据需要合并。