线程唤醒的两种方式

本文探讨了Java中线程的唤醒方法,主要通过LockSupport.unpark()和中断thread.interrupt()来实现。示例代码展示了一个自旋的线程如何被LockSupport.unpark()和中断唤醒,执行结果显示线程能够在两种方式下成功解除阻塞状态并继续执行。
摘要由CSDN通过智能技术生成

通过 LockSupport.park(); 阻塞的线程,可以通过下面两种方式唤醒:

  1. 通过 LockSupport.unpark(thread) 唤醒
  2. 使用中断 thread.interrupt() 唤醒
public static void main(String[] args) {
    Thread t0 = new Thread(() -> {
        Thread current = Thread.currentThread();
        System.out.println("{},开始执行!"+current.getName());
        for(;;){//spin 自旋
            System.out.println("准备park住当前线程:{}...."+current.getName());
            LockSupport.park();
            System.out.println("当前线程{}已经被唤醒...."+current.getName());
        }
    },"t0");
    t0.start();
    try {
        Thread.sleep(2000);
        System.out.println("准备唤醒{}线程!"+t0.getName());
        LockSupport.unpark(t0);
        Thread.sleep(2000);
        t0.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

执行结果:

{},开始执行!t0
准备park住当前线程:{}....t0
准备唤醒{}线程!t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
当前线程{}已经被唤醒....t0
准备park住当前线程:{}....t0
	...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值