在java 中,收到一个消息后,启动了4个线程,这4个线程都需要更新界面,这个时候需要同步不呢?

2025-06-22 22:37:00
推荐回答(4个)
回答1:

GUI上的组件都是由一个独立的线程维护的,叫做事件分发线程(event-dispatching thread),跟你启动的线程没有关系。因此,JAVA要求所有可能影响组件变化的代码都应该由事件分发线程完成。
怎么保证对界面的更改由事件分发线程来执行,需要用invokeLater()或者invokeAndWait()来调用你的线程,它们都是SwingUtilities的方法。前者是启动一个线程调用后立即返回,后者是启动线程后等待完成后再返回,类似Thread的join()方法的效果。
使用方法如下:
Runnable doWorkRunnable = new Runnable() {
public void run() { doWork(); }
};
SwingUtilities.invokeLater(doWorkRunnable);
然后是第二个:
void showHelloThereDialog()
throws Exception {
Runnable showModalDialog = new
Runnable() {
public void run() {
JOptionPane.showMessageDialog(
myMainFrame, "Hello There");
}
};
SwingUtilities.invokeAndWait
(showModalDialog);
}
将处理逻辑(例如需要长时间计算的逻辑或需要监听socket的,一般用invokeLater方法)及后续的更新界面的逻辑放在这两个方法中。如果更新的是同一个共享资源,需要使用synchronized对更改共享资源的方法进行同步,保证一次只有一个线程在操作共享资源。

回答2:

操作同一个对象的话,还是加上synchronized话的好,经常卡住很有可能是没有同步造成的,
建议同步试一下,不妨看看效果。

回答3:

代码给我,我给你改,或者说下你想干嘛,我给你做!!!

回答4:

1L真热情啊--