2

I have "Creator" class that has anonymous inner runnable class that creates threads. I also have GUI class that creates GUI and on button press executes the "Creator" class. But then my GUI freezes until all threads created by "Creator" are completed. I found that SwingWorker could help me in this situation, but I fail to understand how to create one in this particular situation. And is there any other easy way to do that, than SwingWorker?

Here is the code for my Creator class:

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) {

            }
        }
    }
}
4

2 に答える 2

0

コードが完了するまでハングする理由は、Future の get メソッドへの呼び出しが原因です。これは完了するまで待機します。また、おそらく、すべてのスレッドを追加した直後にプールをシャットダウンしたくないでしょう。on close イベントを追加して、そこでシャットダウンする方がよいでしょう。

やっていることは数字を出力してスリープしているだけなので、Future が完了するのを待つ必要はありません。get の呼び出しを削除するだけで、遅延が停止するはずです。

于 2012-07-24T20:24:48.167 に答える
0

doInBackground()はい、Swing ワーカーは最適な方法です。Web には十分な例がありますが、要約すると、スレッドの生成と待機のコードpublish()/process()をのEDTスレッドdone()

PS。SwingWorker の使用法とは関係なく、すべての先物を順番に待つのではなく、完了サービスの使用を検討することをお勧めします。

于 2012-07-25T00:40:24.840 に答える