【问题标题】:SwingWorker to run class that creates threads. JavaSwingWorker 运行创建线程的类。爪哇
【发布时间】:2012-07-23 05:31:02
【问题描述】:

我有“Creator”类,它具有创建线程的匿名内部可运行类。我也有创建 GUI 的 GUI 类,按下按钮执行“创建者”类。但随后我的 GUI 冻结,直到“创建者”创建的所有线程都完成。我发现 SwingWorker 在这种情况下可以帮助我,但我不明白如何在这种特殊情况下创建一个。除了 SwingWorker,还有其他简单的方法吗?

这是我的 Creator 类的代码:

public class Creator {

    final ExecutorService es;
    Collection<Future<?>> futures = new LinkedList<>();


    public Creator() {
        es = Executors.newFixedThreadPool(10);
    }

    public void runCreator() {

        for (int i = 0; i < 100; i++) {
            futures.add(es.submit(new Check(i)));
        }

        es.shutdown();

        for (Future<?> future : futures) {
            try {
                future.get();
            } catch (Exception ex) {

            }
        }

    }

    private class Check implements Runnable {

    private int i;

        private Check(int i) {
            this.i = i;

        }

        @Override
        public void run() {

    System.out.println("Number: "+i);

    try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {

            }
        }
    }
}

【问题讨论】:

  • 能否展示一些您正在创建线程的代码?
  • 好的,我会编辑我的代码,我会尽量让它变得简单
  • 谢谢,看起来这是因为您调用了 Future 的 get 方法。
  • 是的,现在我自己也搞定了,但我无法删除它,因为我需要知道线程何时完成

标签: java multithreading user-interface swingworker


【解决方案1】:

您的代码在完成之前一直挂起的原因是因为调用了您的Future's get method。这将等到它完成。此外,您可能不想在添加所有线程后立即关闭池。最好只添加一个关闭事件并将其关闭。

由于您所做的只是打印一个数字并休眠,因此您无需等待 Future 完成。只需删除 get 调用,延迟就会停止。

【讨论】:

  • 你的内部可运行类是做什么用的?
  • 这不会影响线程池中的可运行。您会希望它在提交到池后返回控制权。除非发帖人在返回的 Future 上调用 get()?
  • 但我还需要知道线程何时完成,我如何管理?
  • 但那是简化的代码,实际上它做了更多代码中显示的事情,我只需要知道线程何时完成
  • 让你的runnables能够在它们完成时发出信号可能是值得的。他们需要做什么?
【解决方案2】:

是的,Swing worker 是要走的路——网上有足够多的例子,但总结一下——把你的线程生成和等待代码放在doInBackground(),如果你想报告临时进度,请使用publish()/process()最后,将您的数据发送到 done() 中的 Swing EDT 线程。

PS。与 SwingWorker 的使用无关,您可能需要考虑使用完成服务,而不是按顺序等待所有期货。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2013-10-13
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多