SwingWorker运行创建线程的类。 Java的

时间:2012-07-24 20:14:43

标签: java multithreading user-interface swingworker

我有“Creator”类,它具有创建线程的匿名内部可运行类。我还有创建GUI的GUI类,按下按钮执行“Creator”类。但随后我的GUI冻结,直到“Creator”创建的所有线程都完成。我发现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) {

            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

由于你正在做的就是打印一个数字并且正在睡觉,所以你不需要等待Future完成。只需删除对get的调用,就应该停止延迟。

答案 1 :(得分:0)

是的,Swing worker是可行的方法 - 网上有足够的示例,但总结一下 - 将您的线程生成和等待代码放在doInBackground()中,如果您想报告临时进度,请使用{ {1}}最后,将您的数据发送到publish()/process()中的Swing EDT主题。

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