我写了两个类...想通过java的垃圾收集来关掉我在运行的thread...
但调用function2()进行关闭时...会出现java.net.SocketException: socket closed
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
at java.net.DatagramSocket.receive(DatagramSocket.java:712)
at serverRun.Server.recPacket(Server.java:33)
at serverRun.Server.run(Server.java:22)class A{
   private B b;
   function1(){
     b = new B();
     b.start();
   }
   function2(){
    b.threadStop()
   }
}class B extends Thread{
 private boolean threadStop = false;
 int port;
 DatagramSocket socket;
  public void run(){
    try{
       while(threadStop == false){
        //udp 接收信息
     }catch(...){
       ....
      }
  }public void threadStop(){
this.threadStop = true;
this.port = 0;
try{
//socket.disconnect();  如果用disconnect 就会倒致程序死掉..
socket.close();
}catch(Exception ex){

}finally{
this.socket = null;
}
}
}

解决方案 »

  1.   

    将你的程序修改一下,在你的threadStop()中只需要发出Stop指令,而Stop时候需要进行的一些具体处理放到Run中去。
    如下:
    class B extends Thread{
     private boolean threadStop = false;
     int port;
     DatagramSocket socket;
      public void run(){
        try{
           while(ture){
             if (!threadStop) {
               //udp 接收信息
             } else {
               socket.close();
               break;
             }
         }catch(...){
           ....
          }
      }public void threadStop(){
    this.threadStop = true;
    }
      

  2.   

    还是有问题代码import java.net.DatagramPacket;
    import java.net.DatagramSocket;import org.eclipse.swt.widgets.Text;import serverGUI.ServerWindow;public class Server extends Thread { private boolean threadStop = false; int port; DatagramSocket socket; public Server() {
    this.threadStop = false;
    this.socket = null;
    } public void run() {
    System.out.println("thread runs");
    this.recPacket();
    } private void recPacket() {
    try {
    byte[] buffer = new byte[debug.Constants.packageLen];
    port = debug.Constants.port;
    socket = new DatagramSocket(port);
    DatagramPacket packet;
    while (threadStop == false) {
    if (this.threadStop == false) {
    packet = new DatagramPacket(buffer, buffer.length);
    socket.receive(packet);
    if (debug.Constants.isDebug) {
    String ss = new String(packet.getData());
    System.out.println("ss");
    }
    //new DealingWithPacket(packet).start();
    }else{
    packet = null;
    socket.close();
    socket = null;
    break;

    }
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    } public void threadStop() {
    this.threadStop = true;
    }
    }错误
    java.net.BindException: Address already in use: Cannot bind
    at java.net.PlainDatagramSocketImpl.bind0(Native Method)
    at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:82)
    at java.net.DatagramSocket.bind(DatagramSocket.java:368)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:210)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:261)
    at java.net.DatagramSocket.<init>(DatagramSocket.java:234)
    at serverRun.Server.recPacket(Server.java:32)
    at serverRun.Server.run(Server.java:25)
      

  3.   

    CAD下 看看有没有java.exe进程
      

  4.   

    嗯...关了...每次都是关了再试....都是关了才试的..程序第一次new 张程start是没事的..然后调用threadStop
    然后再new一个线程时就有问题了...问题就是上面的问题