Java 线程似乎重置了其当前状态
我是Java的初学者。最近,我开始使用Eclipse向UDP聊天程序添加一些图形 我使用两个类,一个用于发送数据报,另一个用于接收传入数据报。后者实际上启动一个线程,等待新的传入数据报。 我曾经有过第三个Java 线程似乎重置了其当前状态,java,multithreading,udp,Java,Multithreading,Udp,我是Java的初学者。最近,我开始使用Eclipse向UDP聊天程序添加一些图形 我使用两个类,一个用于发送数据报,另一个用于接收传入数据报。后者实际上启动一个线程,等待新的传入数据报。 我曾经有过第三个聊天类,其中有一个公共静态void main(String[]args),使发送类和接收类一起工作。这种安排非常有效 现在,我想让它更人性化。我构建了一个简单的GUI,但是与JButton对象关联的事件处理程序有问题` //startStop BUTTON startStop = new
聊天
类,其中有一个公共静态void main(String[]args)
,使发送
类和接收
类一起工作。这种安排非常有效
现在,我想让它更人性化。我构建了一个简单的GUI,但是与JButton
对象关联的事件处理程序有问题`
//startStop BUTTON
startStop = new JButton("Confirm");
startStop.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(!receive.isAlive()) {
if(send.setAddress(address.getText())) {
address.setEditable(false);
address.setBackground(Color.green);
message.setEnabled(true);
sendButton.setEnabled(true);
startStop.setText("Stop");
receive.start();
}
else {
address.setBackground(Color.red);
}
}
else {
address.setEditable(true);
address.setBackground(Color.white);
message.setEnabled(false);
message.setText("");
sendButton.setEnabled(false);
startStop.setText("Confirm");
receive.interrupt();
}
}
});
startStop.setBounds(309, 7, 89, 23);
frmChat.getContentPane().add(startStop);
如您所见,单击事件处理程序检查Receive
对象启动的线程当前是否正在运行。如果是,线程将被中断。如果不是,线程将启动。
现在的问题是,当我执行程序时,按钮没有相应地动作。调试程序并观看isAlive()
和isInterrupted()
,Eclipse会让我观看这两个方法一段时间,但当调试转到另一个方法时,它会说在评估过程中发生了错误。我使用的Receive
对象是主类的私有属性,其中包括发布的代码
当我按下按钮时,主类再次获得控制权,isAlive()
和isInterrupted()
返回false
。
我真的搞不懂。我希望已经说清楚了。谢谢。您不应该从多线程、网络I/O和AWT之类的高级主题开始学习java。实际上,我已经学习了整个手册并做了很多练习。我说我是一个初学者,因为我开始的时间相对较短。AWT中的事件(如
mouseClicked
)由事件调度线程(EDT)执行。如果您希望在主线程上运行代码,请在事件中使用EventQueue.invokeLater
或EventQueue.invokeAndWait
,我没有忘记这件事,只是我不得不出国,有几天我都没法做这件事。我现在回来了,我要试试那个解决办法。我会让你知道的。所以,我刚刚替换了行receive.start()代码>与EventQueue.invokeLater(接收)
,其中receive
是Runnable
对象,但没有任何更改。