java线程阻塞唤醒、interrupt测试

线程阻塞可以采用Object.wait()、Object.notify()来控制线程的阻塞唤醒。

另一种方式是调用Unsafe.park()、Unsafe.unpark()。

 

在主动调用线程interrupt方法之后,目标线程如果正在block状态就会被唤醒,通过Object.wait()、Unsafe.park()控制的阻塞都会被唤醒并直接往下执行,但是如果执行后面的逻辑中再次碰到Object.wait()就会再次被阻塞,而如果是碰到Unsafe.park()线程则会直接往下执行。测试代码如下

 


public class InterruptTest {
	public static void main(String[] args) {
		String t1b = "t1 block";
		final Thread t1 = new Thread(()->{
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < 10000000; i++) {
				sb.append(i ^ 100);
			}
			try {
				synchronized (t1b) {
					t1b.wait();
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(1);
			LockSupport.park(t1b);//park 在线程被标识为interrupt之后会直接往下执行
			//Object.wait() 在线程标识为interrupt之后还是会阻塞
			try {
				synchronized (t1b) {
					t1b.wait();
				}
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(2);
		});
		t1.start();
//		try {
//			Thread.sleep(500);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		//线程如果正在wait、sleep中会直接抛出一个InterruptedException异常并且往下执行,如果再次碰到wait、sleep那还是会被阻塞
		//线程如果是RUNNING状态,之后第一次遇到wait或者sleep也会抛出InterruptedException异常并且往下执行,但是再次遇到wait、sleep时还是会被阻塞
		//如果是park则都会直接跳过并且不抛出异常
		t1.interrupt();
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值