Java 我需要同步吗?
我需要添加某种同步吗?我创建了另一个线程来管理与服务器的TCP通信。流程如下:Java 我需要同步吗?,java,user-interface,synchronization,Java,User Interface,Synchronization,我需要添加某种同步吗?我创建了另一个线程来管理与服务器的TCP通信。流程如下: private void sendLetterButtonActionPerformed(java.awt.event.ActionEvent evt) { try { // TODO add your handling code here: session.getCurrentMatch().guessALett
private void sendLetterButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
// TODO add your handling code here:
session.getCurrentMatch().guessALetter(this.letterTextField.getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Please insert one letter only");
}}
public void guessALetter(String l) throws Exception {
DataPacket dp = new DataPacket();
Communicator c = new Communicator(p, session);
c.start();
}
public class Communicator extends Thread {
private Packet packet;
private Session session;
public Communicator(Packet p, Session s) {
this.session = s;
this.packet = p;
}
public void run() {
System.out.println("Communicator: "+Thread.currentThread());
Socket socket = session.getClientSocket();
ObjectOutputStream out = session.getOut();
ObjectInputStream in = session.getIn();
ResponsePacket reply;
try {
out.writeObject(this.packet);
out.flush();
reply = (ResponsePacket) in.readObject();
System.out.println("Received" + reply.getCurrentWordView() + reply.getCurrentWordView());
session.getCurrentMatch().setLastReply(reply);
session.getCurrentMatch().manageResponsePacket(reply);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex);
}finally{
}}}
public void manageResponsePacket(ResponsePacket reply) {
this.setLastReply(reply);
if (reply.isGameMode()) {
setWordView(reply.getCurrentWordView());
setCounter(reply.getFailedAttemptsCounter());
setChanged();
notifyObservers(EventEnum.GAMERESPONSE);
} else if (reply.isGameOverMode()) {
}
}
因此,正如您所看到的,第二个线程是更新gui的线程。如果
manageResponsePacket()
更新swing/awt gui,则会出现问题。您只能在EDT上更新swing/awt GUI。使用SwingUtilities.invokeLater()
用responsePackage更新GUI。在“guessALetter”方法中,启动了一个新线程,但主线程是另一个线程,对吗?k,那么你让主应用线程调用其他方法了吗?没有其他线程?主线程是EDT吗?(这是swing/awt应用程序吗)?这是swing应用程序,所以主应用程序应该是edt。我没有创建其他线程-1和投票关闭太本地化。你有什么问题?你能把你的问题分解成不仅仅是代码转储的东西吗?我不确定这个问题对其他人会有什么帮助,因为它太宽泛了。实际上,我使用了观察者模式,所以我只是从该方法调用notifyObservers。这是一个问题吗?NotifyObservators是同步的还是异步的?我使用java提供的一个(实现和扩展Observable和Observator),所以我不知道它是如何实现的。它是同步的,所以我的答案仍然是一样的。