0

WinA と WinB の 2 つの jframe があります。また、プロセスを実行するクラス Callable もあります。

WinA には、Callable を使用してスレッドでプロセスを実行するボタンがあり、WinB にはプログレスバーが表示されます。

WinAクラス コード - ボタンの ActionPerformed。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            WinA wa = new WinA();
            WinB wb = new WinB();
             ClaseCallable callbd = new ClaseCallable();
             ExecutorService exesrv = Executors.newSingleThreadExecutor();
             Future sresp;
             sresp = exesrv.submit(callbd);
             wb.getProgressbar().setIndeterminate(true);
             wb.setVisible(true);
             System.out.println(">>" + sresp.get());
             exesrv.shutdown();
             wb.setVisible(false);
        } catch (InterruptedException | ExecutionException ex) {
            Logger.getLogger(WinA.class.getName()).log(Level.SEVERE, null, ex);
        }
    }          

ClaseCallableクラスコード

public class ClaseCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        for(int i=0; i<10; i++){
            Thread.sleep(250);
        }
        return 33;
    }

}

から実行しWinAてボタンを押すと、ウィンドウが開きますWinBが、ウィンドウは白く、最後に結果が表示されます。

EDT スレッドでイベントを実行してスイングし、別のスレッドで処理している場合、なぜこれが発生するのか理解できません。

4

1 に答える 1

1

future.get()タスクが完了するまでブロックする呼び出しを行っています:

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html#get()から

get V get() は InterruptedException、ExecutionException をスローします

必要に応じて計算が完了するまで待機し、その結果を取得します。

于 2013-07-01T18:17:46.260 に答える