t.interrupt()并不是用来杀线程的,他只是做一个标记,你应该在run中用interrupted来检测是否在线程外有人要让他中止,如果线程再阻赛的时候被interrupt(),线程会抛出异常,你可以在catch中退出run.
t = null;
没用的

解决方案 »

  1.   

    使线程中断的正确方法是在线程类里设置一个标志,通过改变这个标志来使线程退出,强行中断线程可能会带来意想不到的结果,如下所示:
    public void run() {
      while (true) {
        // do something
        ....    if (finished)  // finished is a boolean variable
          break;
      }
    }
      

  2.   

    大致代码如下
    public class InfoRece extends Thread
    {
       boolean shouldBeKilled;
       Socket  socket;
     /*
     ......
    */   public void run()
       {
                 try
                 {
                    inn = socket.getInputStream();
                    out = socket.getOutputStream();
                 }
                 catch(Exception ex)
                 {
                    System.err.println("InfoRece1:"+ex);
                 }
           try
           {
              while(true)
              {
                String info = readInfo(inn);
                /*
                ...
                */
               }
             }
             catch(Exception ex)
             {
                shouldBeKill = true;
                System.err.println("infoRece2 :"+ex);
                break;
              }
           
              try
              {
                   socket.close();
              }
              catch(Exception e)
              {          }
           }
        
          public String readInfo(InputStream in) throws Exception
          {
               int len = 0;
               byte[] b = new byte[1024];
               String str = null;
               try
               {
                   while((len = in.read(b,0,b.length)) != -1)
                   {
                     /*
                     ...
                     */
                     return str;
                   }
                }
                catch(Exception ex)
                {
                       System.err.println(ex);
                       return str;
                }      }
           
        }
      

  3.   

    然后我在另外一个线程将该线程
    t.interrupt() ;
    t = null;在String info = readInfo(inn);
    输出info,
    该线程仍然能输出信息。也无法捕获任何异常
      

  4.   

    shouldBeKill 光定义,赋值
    但是你没用它监测线程呀???
    其实用interrupt(),再检测interrupted()就可以了
      

  5.   

    我是在另外一个monitor守护线程来监测InfoRece,当shouldBeKill为true时,
    t为InfoRece的一个线程
    t.interrupt() ;
    t = null;
      

  6.   

    又调试了一下,在InfoRece的run里while(true)循环里加上
    if(shouldBeKill)break;

    monitor守护线程里将
    t.shouldBeKill = true;
    t.interrupt() ;
    t = null;
    这样可以在该socket执行完readinfo()后break,终止线程
    主要的问题是len = in.read(b,0,b.length)) != -1是阻塞的,
    在一个client 连接上server建立socket,但是不发出数据的话,线程会一直阻塞在len = in.read(b,0,b.length)) != -1这里,无法中断他,
      

  7.   

    主要的问题是len = in.read(b,0,b.length)) != -1是阻塞的,
    好办,在你的线程t.start()之后紧接着调用
    try{t.join(timeout);}
    catch(InterruptedException e){}
    其中timeout是连接超时,单位毫秒,就行了不过,你的程序,我看起来总觉得结构有点别扭,看看Core Java chapter3,
    可能对你有很大的帮助,尤其是你的程序的结构