我想做的就是启动一个线程来监听某个端口上的通信。
我通过 jDialog 上的“确定”按钮开始此操作。单击“确定”后,jDialog 应该隐藏自身 (HostClientDialog.setVisible(false);),当线程起始行不在其中时,该功能会起作用。
try {
HostClientDialog.setVisible(false);
// start a thread that listens for incoming messages
new gameCycle().start();
} catch (Exception e) { }
new gameCycle().start(); 行正在调用以下代码:
public class gameCycle extends Thread {
//public gameCycle(){
// super();
//}
@Override
public void run() {
try {
ServerSocket connection = new ServerSocket(4242);
// Wait for connection
Socket s = connection.accept();
// Socket input
BufferedReader in = new BufferedReader(new
InputStreamReader(s.getInputStream()));
// for receiving moves
while (true) {
String message = "";
message = in.readLine();
if (message != null && !message.equals("")) {
// do something with message
}
sleep(100);
} // end while
} catch (Exception e) { }
} // end run
} // end class
我理解上面的代码是循环的,直到收到消息,然后对消息执行某些操作。但是,当您执行此代码时,会再次(立即)创建 jDialog 框并重新提示用户单击“确定”。它不会让用户通过 jDialog 框,它只会不断地重新提示他们。
我对线程相当陌生(除了使用多线程打印之外,我没有做更多的事情),所以我觉得我可能错误地实现了它。但我四处寻找例子,它们似乎或多或少是我所拥有的。
编辑(美国东部时间 2010 年 11 月 29 日凌晨 1:30)
看来我对TCP通信的理解并不像我想象的那么好。我的线程和后续 while 循环的目标如下:
- 程序会在后台 正在等待发送的任何消息 方式
- 如果它收到一条消息,它会更新 GUI 上的某些内容,然后返回等待更多消息
始终允许用户持续使用 GUI。
最佳答案
我想说您提供的代码对我来说看起来不错。
我将实现取消整个线程的可能性,而不是使用 while(true) 循环。 请改用 boolean 值,并使其他线程可以访问该 boolean 值。如果您需要这方面的帮助,请回来找我。
我认为问题出在我们在这里看不到的代码上。 我对线程上 .start() 调用周围的代码片段部分感兴趣。之后会发生什么?
干杯
编辑:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
final JDialog dia = new JDialog();
JButton btn = new JButton("Foo");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
dia.setVisible(false);
Runnable t = new Runnable() {
public void run() {
System.out.println("foo");
}
};
t.run();
}
});
dia.getContentPane().add(btn);
dia.setSize(500, 400);
dia.setVisible(true);
}
}
这对我来说非常有效 - 抱歉,但我无法重现您在评论中所述的错误。请考虑提供更多代码:)
编辑#2: 不要直接在线程内设置任何变量。相反,请使用观察者-监听者模式。当有新消息传入时,让线程触发 propertyChangeEvent。 http://download.oracle.com/javase/1.4.2/docs/api/java/beans/PropertyChangeListener.html
也许您应该尝试实现一些更琐碎的事情..首先进行快速轻松的聊天。 http://www.ashishmyles.com/tutorials/tcpchat/index.html
当你记下这些之后,请考虑一下你的 future 项目。也许阅读有关 swing 的多线程可能会有所帮助? http://java.sun.com/developer/technicalArticles/Threads/swing/
关于java - 线程的简单问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4301056/