Java 线程似乎重置了其当前状态

Java 线程似乎重置了其当前状态,java,multithreading,udp,Java,Multithreading,Udp,我是Java的初学者。最近,我开始使用Eclipse向UDP聊天程序添加一些图形 我使用两个类,一个用于发送数据报,另一个用于接收传入数据报。后者实际上启动一个线程,等待新的传入数据报。 我曾经有过第三个聊天类,其中有一个公共静态void main(String[]args),使发送类和接收类一起工作。这种安排非常有效 现在,我想让它更人性化。我构建了一个简单的GUI,但是与JButton对象关联的事件处理程序有问题` //startStop BUTTON startStop = new

我是Java的初学者。最近,我开始使用Eclipse向UDP聊天程序添加一些图形

我使用两个类,一个用于发送数据报,另一个用于接收传入数据报。后者实际上启动一个线程,等待新的传入数据报。 我曾经有过第三个
聊天
类,其中有一个
公共静态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
对象,但没有任何更改。