期货与线程内部设置的区别

时间:2014-10-18 16:05:32

标签: java multithreading future

今天我在java中发现了线程。现在,我希望线程能够改变我的gui。我有这两个实现。我不知道他们之间是否有任何重大差异。 但是第一个没有期货的人会挂掉'我的节目。我的gui变得非常反应迟钝等。第二个似乎更好。任何人都可以解释我哪一个最好,为什么?

Runnable hasherRunnable = new Runnable() {
        public void run()  {

            notifyObservers(getHasher().hash(input));

        }};

        this.getPool().submit(hasherRunnable,"hasherThread");
    Callable<String> callableHasher=new Callable<String>(){
        public String call(){
            return getHasher().hash(input);
        }
    };
    ============================================================
    Future<String> future = this.getPool().submit(callableHasher);
    try {
        notifyObservers(future.get());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:3)

您不应该从事件调度线程(EDT)以外的任何线程更新GUI。要在EDT上运行runnable,请使用:

EventQueue.invokeLater( new Runnable(){
             @Override
             public void run() {

             }
        });

Swing还有SwingWorkers个工作线程,您可以使用这些线程在EDT上执行耗时的操作并将更新返回到GUI。你像这样使用它们:

   new SwingWorker<T,T>(){
        @Override
        public Void doInBackground(){
           return t;  //Object of some type T 
        }

       @Override
       public void done() {
          try {
              T somVariable = get();
              // Use someVariable to update the GUI 
           }
          catch (InterruptedException ignore) {
             // handle exception
          }
          catch (java.util.concurrent.ExecutionException e) {
            // handle exception
          }
       }.execute();

SwingWorkers让处理未来变得容易多了。有关这些的更多信息,请阅读工作线程上的Java tutorials