4

私はSwingWorkerexecute()とdoInBackground()の違いを見つけようとしています。そこで、違いをテストするためにこの簡単なプログラムを作成しました。

 public static void main(String[] args) {
    // TODO code application logic here
    for(int i=0;i<10;i++){
        try {
            new Worker().execute();
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

public static class Worker extends SwingWorker<Void,Void>{

    @Override
    protected Void doInBackground() throws Exception {
       System.out.println("Hello");
       return null;
    }

}

このプログラムを実行すると、次の例外が発生しました。

Exception in thread "AWT-Windows" java.lang.IllegalStateException: Shutdown in progress
    at java.lang.ApplicationShutdownHooks.add(ApplicationShutdownHooks.java:39)
    at java.lang.Runtime.addShutdownHook(Runtime.java:192)
    at sun.awt.windows.WToolkit.run(WToolkit.java:281)
    at java.lang.Thread.run(Thread.java:619)

しかし、doInBackground()を使おうとすると

new Worker().doInBackground();

プログラムは動作し、期待される結果を出力します。だから私のエラーは何ですか?使用すべきではないことを読んだので、doInBackground()メソッドを使用する必要があります。

ありがとう

4

1 に答える 1

8

execute()メソッドは、現在のスレッドで呼び出されます。ワーカースレッドでの実行のためにSwingWorkerをスケジュールし、すぐに戻ります。あなたの場合、スケジュールされたワーカースレッドがdoInBackground()メソッドを実行する前にメインスレッドが終了します。メソッドを使用して、SwingWorkerが完了するのを待つことができget()ます。

于 2010-10-06T06:25:34.310 に答える