13-线程休眠和指定唤醒:LockSupport

LockSupport是Java并发工具类,提供park()和unpark()方法来控制线程的休眠和唤醒,无需加锁。与wait/notify不同,LockSupport不抛出InterruptedException,且能指定唤醒特定线程。此外,parkUntil()允许设置最大等待时间。文章对比了LockSupport与wait的异同,并介绍了线程休眠的多种方式。

目录

1.LockSupport.park():休眠当前线程

2.LockSupport.unpark(线程对象):唤醒某一个指定的线程

3.扩展:LockSupport.parkUntil(long)等待最大时间是一个固定时间

4.LockSupport和Interrupt

5.LockSupport VS wait

相同点:

①二者都能使线程进入休眠状态。

②二者在不传递参数的情况下,都会让线程进入WAITING无限期等待状态。

不同点:

①LockSupport使用时不需要加锁,不需要配合synchronized一起使用;而wait需要配合synchronized一起使用。

②LockSupport不会抛出Interrupt的异常,而wait会。

③LockSupport可以指定某一个线程进行唤醒,而wait和notify不行。

PS:线程休眠4种方式:


有wait和notify是因为sleep只能到点之后再被唤醒,不能主动唤醒。

上述方法的问题:在调用notify时会随机唤醒,无法唤醒指定的某一个线程,不能把握线程唤醒的顺序。

使⽤ LockSupport 也可以使线程休眠和唤醒,它包含两个主要的⽅法↓

注:LockSupport 无需配合 synchronized 使用。

1.LockSupport.park():休眠当前线程

import java.util.concurrent.locks.LockSupport;

public class LockSupportDemo1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("线程1:开始执行");
            LockSupport.park();
            System.out.println("线程1:结束执行");
        },"线程1");
        t1.start();
    }
}

2.LockSupport.unpark(线程对象):唤醒某一个指定的线程

import java.util.concurrent.locks.LockSupport;

public class LockSupportDemo1 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("线程1:开始执行");
            LockSupport.park();
            System.out.println("线程1:结束执行");
        },"线程1");

        Thread t2 = new Thread(() -> {
            System.out.println("线程2:开始执行");
            LockSupport.park();
            System.out.println("线程2:结束执行");
        },"线程2");

        Thread t3 = new Thread(() -> {
            System.out.println("线程3:开始执行");
            LockSupport.park();
            System.out.println("线程3:结束执行");
        },"线程3");

        t1.start();
        t2.start();
        t3.start();

        Thread.sleep(1000);
        System.out.println();
        LockSupport.unpark(t1); //唤醒线程1开始执行

        Thread.sleep(1000);
        LockSuppo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值