最近做一个awt的udp小程序
服务器端要实时检测端口
需要一个循环实现
不知道在线程中如何实现安全中止线程
用thread.stop()界面会有问题
简单代码如下:
public class udp_thread extends Thread
{
    private int port;
    private int buffer_size;
    private JTextArea mem_message;    public udp_thread(int port, int buffer_size, JTextArea mem_message)
    {
        this.port = port;
        this.buffer_size = buffer_size;
        this.mem_message = mem_message;
    }    public void run()
    {
        byte[] buffer = new byte[buffer_size];
        try
        {
            DatagramSocket server = new DatagramSocket(port);
            while(true)
            {
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
                server.receive(packet);
                if (packet.getLength() <= 0)
                    continue;
                this.respond(packet);
            }
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
        }
    }    public void respond(DatagramPacket packet)
    {
        byte[] buffer = new byte[packet.getLength()];
        System.arraycopy(packet.getData(), 0, buffer, 0, packet.getLength());
        try
        {
            String str = new String(buffer, "8859_1");
            mem_message.append(packet.getAddress() + " [" + packet.getPort() + "] : " + str + "\r\n");
        }
        catch (Exception ex)
        {
        }
    }
}

解决方案 »

  1.   

    从你的程序看,只有发生了异常,线程才能结束。你要中断线程,总归是有条件中断吧?把这个条件加到
    while里面不就可以了,不要一直true。
      

  2.   

    thread.stop()由于其破坏了对象的完整性 已经在JDK1.5起不建议使用了~~随着时间推移可能将
    弃用~~取而代之的是  void interrupt()    中断线程。 LZ可以试试
      

  3.   

    void interrupt()不行
    加入标志变量我试了 
    可是server.receive(packet);必须接收一次客户端udp的数据
    才能够进入下次循环然后退出
      

  4.   

    boolean b=true;
    while(b){把B的值改为false}
      

  5.   

    恩boolean flag = true;while(flag){
        dosomething;
        if(need interrupt){
            flag = false;
        }}
      

  6.   

    设定一个标志变量,给这个变量写一个set方法,假设你线程的实例为udp_thread a;在需要停止线程的地方调用
    a.setexitflag(true);
    a.interrupt();
    while(a.isAlive());//等待线程结束
      

  7.   

    同意楼上的意见设置标志
    或者packet 在发送的包里存储些字符 如果是1就终止 然后你收到包后取出内容判断