打字猴:1.700449929e+09
1700449929
1700449930 }
1700449931
1700449932 这是很简单的办法,在线程体中判断是否需要停止运行,即可保证线程体的逻辑完整性,而且也不会破坏原子逻辑。可能有读者对Java API比较熟悉,于是提出疑问:Thread不是还提供了interrupt中断线程的方法吗?这个方法可不是过时方法,那可以使用吗?它可以终止一个线程吗?
1700449933
1700449934 非常好的问题,interrupt,名字看上去很像是终止一个线程的方法,但是我可以很明确地告诉你,它不是,它不能终止一个正在执行着的线程,它只是修改中断标志而已,例如下面一段代码:
1700449935
1700449936 public static void main(String[]args){
1700449937
1700449938 Thread t1=new Thread(){
1700449939
1700449940 public void run(){
1700449941
1700449942 //线程一直运行
1700449943
1700449944 while(true){
1700449945
1700449946 System.out.println(“Running……”);
1700449947
1700449948 }
1700449949
1700449950 }
1700449951
1700449952 };
1700449953
1700449954 //启动t1线程
1700449955
1700449956 t1.start();
1700449957
1700449958 //中断t1线程
1700449959
1700449960 t1.interrupt();
1700449961
1700449962 }
1700449963
1700449964 执行这段代码,你会发现一直有Running在输出,永远不会停止,似乎执行了interrupt没有任何变化,那是因为interrupt方法不能终止一个线程状态,它只会改变中断标志位(如果在t1.interrupt()前后输出t1.isInterrupted()则会发现分别输出了false和true),如果需要终止该线程,还需要自行进行判断,例如我们可以使用interrupt编写出更加简洁、安全的终止线程代码:
1700449965
1700449966 class SafeStopThread extends Thread{
1700449967
1700449968 @Override
1700449969
1700449970 public void run(){
1700449971
1700449972 //判断线程体是否运行
1700449973
1700449974 while(!isInterrupted()){
1700449975
1700449976 //Do Something
1700449977
1700449978 }
[ 上一页 ]  [ :1.700449929e+09 ]  [ 下一页 ]