一个运行中的线程不应该由其他线程强制中断或者停止,而应该由自己决定要不要停止。java提供了一种用于停止线程的协商机制--中断,也叫中断线程协商机制。
每一个线程都有一个中断标识位,用于表示该线程是否需要被中断,true表示需要被中断,false表示不需要被中断。中断只是一种协商机制 java没有给中断增加任何语法,中断过程完全需要程序自己实现。
在java中如何中断或者停止一个正在运行的线程?
第一种方法 用volalitle 关键字模拟中断标识位,通过修改模拟的中断标识位来让线程自己去处理中断或者停止,
1 public class InterruptedDemo { 2 3 private static volatile boolean INTERRUPT_STATUS = false ; 4 5 public static void main(String[] args) { 6 7 new Thread(() ->{ 8 while(true){ 9 if(INTERRUPT_STATUS){ 10 System.out.println("线程中断标识被修改,要求线程进行中断"); 11 break; 12 } 13 System.out.println("hello interrupt..."); 14 } 15 },"t1").start(); 16 17 try { 18 TimeUnit.MILLISECONDS.sleep(1); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 23 new Thread(() ->{ 24 INTERRUPT_STATUS = true ; 25 },"t2").start(); 26 } 27 }
第二种方法 用 AtomicBoolean原子类去实现,原理和第一种方法一样,
1 public class InterruptedDemo2 { 2 3 private static AtomicBoolean INTERRUPT_STATUS = new AtomicBoolean(false) ; 4 5 public static void main(String[] args) { 6 7 new Thread(() ->{ 8 while(true){ 9 if(INTERRUPT_STATUS.get()){ 10 System.out.println("线程中断标识被修改,要求线程进行中断"); 11 break; 12 } 13 System.out.println("hello interrupt..."); 14 } 15 },"t1").start(); 16 17 try { 18 TimeUnit.MILLISECONDS.sleep(5); 19 } catch (InterruptedException e) { 20 e.printStackTrace(); 21 } 22 23 new Thread(() ->{ 24 INTERRUPT_STATUS.set(true); 25 },"t2").start(); 26 } 27 }
第三种方法 用Thread提供的interrupt()方法和 isInterrupted()方法来实现,
public class InterruptedDemo3 { public static void main(String[] args) { Thread t1 = new Thread(() -> { while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("线程中断标识被修改,要求线程进行中断"); break; } System.out.println("hello interrupt..."); } }, "t1"); t1.start(); try { TimeUnit.MILLISECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() ->{ t1.interrupt(); },"t2").start(); } }
其中线程中断机制 Thread提供了三个方法 interrupt(), interrupted() 和isInterrupted()
interrupt(), 仅仅设置线程的中断标识位为true,并不会立刻停止线程,程序执行过程中有两种情况 当正常运行的线程的interrupt()方法被调用时,仅仅将该线程的中断标识位的值设置位true,
如果线程处于阻塞状态(调用 wait,join,sleep方法)时,线程立即退出被阻塞的状态,并且抛出InterruptedException异常。
interrupted()是一个被 static修饰的方法 返回当前线程中断标识的值并且将当前线程中断标识的值设置位false。
isInterrupted() 判断当前线程是否被中断。