我的问题很简单,比如如下的线程方法:
for(int i=0;i<100000;i++)
{
System.out.println("ssssssssssss");
}
它是做一个循环,但是我调用了interrupt方法,该线程没有被中断。我知道可以在循环中加变量,控制循环的中断。
但是我们的线程方法往往比这个要复杂的多,比如里面有网络操作或者IO操作,
这些都是非常耗时的,所以当线程正在做这些操作的时候,有没有办法中断线程,
抛出InterruptedException异常。

解决方案 »

  1.   

    线程只要运行起来,如果其中没有会抛出 java.lang.InterruptedException 异常的语句,那么该线程是无法中断的!
      

  2.   

    for(int i=0; i<100000; i++) {
      if (ready()) {
        System.out.println("ssssssssssss");
      }
    }boolean ready() {
      if (...) { // 判断一个变量,如果没有其他占用,通过这个变量直接占用
        return true;
      }  synchronized(lock) {
        // 锁定,等待许可,可以用wait()之类。
      }
    }
      

  3.   

    给一个停止的标志。  比如,在循环中调用isStop() 返回true,则停止。
      

  4.   

    直接throws new Exception();
      

  5.   

    回复于:2010-05-10 10:31:45
    直接throws new Exception();
    那我该在什么地方throws new Exception()呢?
      

  6.   

    如果你有用到BlockingQueue 类,就像三楼说的,那就可以调用interrupt()来抛出 InterruptedException
    你说你没有抛出,那说明你并没有用到阻塞的方法
      

  7.   

    各线程之间是平等协作的。对于线程来说没有主线程与次线程之分,也不存在于我们想当然认为主线程的权力高于一切,可以恣意地中断子线程的运行。正因为这种观点,在 JDK 之初的版本中就有 Thread#stop 等几个在 JDK 1.2 版本中被标记为 @Deprecation 的方法。强行中断线程将会有很高的可能性造成死锁,具体的可以参看 JDK 文档。目前推荐使用中断的方式有:1:添加监视变量,比如 while(running)
    2:方法在等待锁的同时,被其他线程将该线程中断,这时等待会抛出 InterruptedException,处理一下这个异常便可中断该线程。其中方法 1 不适合用于在 while 循环中会产生阻塞的代码,比如有个阻塞等列在那里阻塞了,这个 while 就不会再运行了,监视变量因此也形同虚设。存在这种情况时应使用方法 2。
      

  8.   

    线程中止,最优雅的处理方式是发一个信号给线程,让线程自己中止自己,而不是外界强制去中止。stop,interrupt都不是最佳方案。如果各位用过VxWorks的话,就很容易理解这一点,它就是同步信号量。具体来说,就像楼上有人说的,设置标志位让线程有条件运行。当要停止该线程时候就让该标志位失效即可。