今天我在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();
}
答案 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。