其实 我被他们几个方法 搞懵了,,,而且还用错方法了。。。 开始使用的时候,也就是 随便看看API 然后以为理解了,,,结果 到目前为止才知道自己真的用错,理解错API了,,坑爹,坑队友就是我。。。
interrupted()
这个是 静态方法,,, 这个方法不能判断 我们new 出来的 线程 是否在中断状态的,这个API 说得有点不太明白了,,, 它判断的是当前的 调用的线程 是否在中断状态的。因此 这个 用法应该是 这样用的
用法例子:
Thread.currentThread().interrupted(); // 只能而且 是 判断当前的线程是否处于中断状态的
**注意,如果线程 成功执行了 interrupt() 将 该线程致为中断状态,即唤醒了线程,那么 当第一次调用 interrupted() 的时候 会返回会 true , 如果再次调用就是 false 了
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false。
**
isInterrupted()
这个 方法就是可以用在 我们 new 出来的线程的中断状态了。。。 其实 这个 方法一度让我非常的误解,看API 说明,更加是 懵。。。 我开始 是这样用法,,, 以为 调用 isInterrupted() 可以判断 当前线程是否 有效的,是否还在 执行 run() 方法,,,非常的 天真。。。 其实 isInterrupted() 默认 状态是 false ... 只有在 线程调用了 interrupt() 方法后,我们马上调用 isInterrupted() 才会 返回 true 的, 意思是 线程处于中断状态,, 而不是 线程 死掉了,,跑完了 run 方法了,,结束了。
interrupt()
执行中断,让 线程 执行,即唤醒线程,, 如果线程在等待或者是 休眠状态会 唤醒 线程,执行 run() 方法,,让线程 尽快执行完成。
如果一个线程处于了阻塞状态(如线程调用了thread.sleep、thread.join、thread.wait、1.5中的condition.await、以及可中断的通道上的 I/O 操作方法后可进入阻塞状态),则在线程在检查中断标示时如果发现中断标示为true,则会在这些阻塞方法(sleep、join、wait、1.5中的condition.await及可中断的通道上的 I/O 操作方法)调用处抛出InterruptedException异常,并且在抛出异常后立即将线程的中断标示位清除,即重新设置为false。抛出异常是为了线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。
isAlive()
线程是否活跃, 这个方法就可以 判断 线程 是否 处于 run() 方法 中,可以判断线程是否 结束了。。。
join( )
该方法就是 让 线程 尽快执行结束了。。等待该线程执行 完了之后才会执行下面的代码的。 结束线程就使用这个方法了,,,
下面是测试小例子可以看看:
package test;
import java.util.ArrayList;
import java.util.List;
public class TestThread {
public static void main(String[] args) {
TestThread1 tt1 = new TestThread1();
tt1.setName("t1");
System.out.println(tt1.interrupted()+"###"+tt1.isAlive()+">>>11>>>>"+tt1.isInterrupted());
tt1.start();
System.out.println(tt1.interrupted()+"###"+tt1.isAlive()+">>>22>>>>"+tt1.isInterrupted());
tt1.interrupt();
System.out.println(tt1.isInterrupted()+"###"+tt1.isAlive()+">>>22>>>>"+tt1.isInterrupted());
try {
tt1.join();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
//e1.printStackTrace();
}
System.out.println("###"+tt1.isAlive()+">>>22---00>>>>"+tt1.isInterrupted());
System.out.println("###"+tt1.isAlive()+">>>22---00==>>>>"+tt1.isInterrupted());
System.out.println("###"+tt1.isAlive()+">>>22---00==>>>>"+tt1.isInterrupted());
System.out.println("###"+tt1.isAlive()+">>>22---11>>>>"+tt1.isInterrupted());
tt1.interrupt();
System.out.println("###"+tt1.isAlive()+">>>22---22>>>>"+tt1.isInterrupted());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("###"+">>>33>>>>"+tt1.isInterrupted());
}
}
class TestThread1 extends Thread{
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("....");
}
}
结果:
false###false>>>11>>>>false
false###true>>>22>>>>false
false###true>>>22>>>>true
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at test.TestThread1.run(TestThread.java:61)
....
###false>>>22---00>>>>false
###false>>>22---00==>>>>false
###false>>>22---00==>>>>false
###false>>>22---11>>>>false
###false>>>22---22>>>>false
###>>>33>>>>false
参考地址:
http://www.cnblogs.com/onlywujun/p/3565082.html
http://www.jb51.net/article/72936.htm
http://www.cnblogs.com/hapjin/p/5450121.html
http://blog.csdn.net/hj7jay/article/details/53462553