当我从另一个JFrame调用JFrame和一个Callable进程时,冻结GUI

时间:2013-06-27 22:13:11

标签: swing jframe event-dispatch-thread callable

我有两个jframe:WinA和WinB,我也有一个Callable类来执行一个过程。

WinA有一个按钮,可以使用Callable在线程中执行一个进程,并使用进度条显示WinB。

WinA类代码 - ActionPerformed of button。

 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线程中执行和摆动事件并在另一个线程中处理。

1 个答案:

答案 0 :(得分:1)

你正在调用future.get(),它将阻止任务完成:

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

  

得到V get()         抛出InterruptedException,ExecutionException

     

如果需要等待计算完成,然后检索其结果。