Java中interrupt的使用和线程中断

停止一个线程的主要机制是中断,中断并不代表强迫终止一个线程,
它是一种协作机制,是给线程传递一个取消的信号,
但是让线程来决定如何以及何时退出。

出现死锁,interrupt无法中断

package demo.thread;

public class ThreadTest {

	/**
	 * 完全中止线程 -正确做法
	 * 
	 * 如果线程里面出现死锁并一直处于等待  interrupt就 中止不了了 
	 */
	private static volatile boolean threadSwitch = true;
	private static Object lock =new Object();
	
	public static void main(String[] args) throws InterruptedException {
		//业务线程
		Thread t = new Thread(()->{
			int count = 0;
			while (threadSwitch && count<5) {//停止线程内部循环开关
				try {
					//Thread.sleep(1000*2); //模拟阻塞线程  
					synchronized (lock){
						System.out.println("开始等待");
						Thread.currentThread().wait(2000);
						System.out.println("等待完了");
					}
				} catch (Exception e) {
					System.out.println("isInterrupted状态:"+Thread.currentThread().isInterrupted());
					e.printStackTrace();
				}
				if(threadSwitch){//双重验证,中止后,立马不再执行其它业务代码
					System.out.println(count++);
				}
				
			}
		});
		synchronized (lock){
			t.start();
			Thread.sleep(5000);
			//验证线程已正常启动
			System.out.println("1isAlive:"+t.isAlive());
			System.out.println("1isInterrupted:"+t.isInterrupted());
			
			//关闭线程
			threadSwitch = false;//关闭循环
			t.interrupt();// 防止循环内部有阻塞- 在有阻塞的情况下,会抛错出来
			
			System.out.println("2isAlive:"+t.isAlive());
			System.out.println("2isInterrupted:"+t.isInterrupted());
			
			Thread.sleep(1000);
			System.out.println("3isAlive:"+t.isAlive());
			System.out.println("3isInterrupted:"+t.isInterrupted());
			t.join();
		}
	}
}

打印结果:

1isAlive:true
1isInterrupted:false
2isAlive:true
2isInterrupted:true
3isAlive:true
3isInterrupted:true
 

如果是有阻塞线程  是可以通过interrupt中断的

package demo.thread;

public class ThreadTest {

	/**
	 * 完全中止线程 -正确做法
	 * 
	 * 如果线程里面出现死锁并一直处于等待  interrupt就 中止不了了 
	 */
	private static volatile boolean threadSwitch = true;
	private static Object lock =new Object();
	
	public static void main(String[] args) throws InterruptedException {
		//业务线程
		Thread t = new Thread(()->{
			int count = 0;
			while (threadSwitch && count<5) {//停止线程内部循环开关
				try {
					Thread.sleep(1000*2); //模拟阻塞线程  
					/*synchronized (lock){
						System.out.println("开始等待");
						Thread.currentThread().wait(2000);
						System.out.println("等待完了");
					}*/
				} catch (Exception e) {
					System.out.println("isInterrupted状态:"+Thread.currentThread().isInterrupted());
					e.printStackTrace();
				}
				if(threadSwitch){//双重验证,中止后,立马不再执行其它业务代码
					System.out.println(count++);
				}
				
			}
		});
		//synchronized (lock){
			t.start();
			Thread.sleep(5000);
			//验证线程已正常启动
			System.out.println("1isAlive:"+t.isAlive());
			System.out.println("1isInterrupted:"+t.isInterrupted());
			
			//关闭线程
			threadSwitch = false;//关闭循环
			t.interrupt();// 防止循环内部有阻塞- 在有阻塞的情况下,会抛错出来
			
			System.out.println("2isAlive:"+t.isAlive());
			System.out.println("2isInterrupted:"+t.isInterrupted());
			
			Thread.sleep(1000);
			System.out.println("3isAlive:"+t.isAlive());
			System.out.println("3isInterrupted:"+t.isInterrupted());
			t.join();
		//}
	}
}

打印结果:

0
1
1isAlive:true
1isInterrupted:false
2isAlive:true
2isInterrupted:false
isInterrupted状态:false
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at demo.thread.ThreadTest.lambda$0(ThreadTest.java:19)
    at java.lang.Thread.run(Thread.java:748)
3isAlive:false
3isInterrupted:false

可以看一下下面博主写的很详细

参照:https://www.cnblogs.com/jenkov/p/juc_interrupt.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值