笔记-LockSupport和Thread.suspend对比

本文对比了LockSupport的park与Thread的suspend方法在挂起线程时的不同行为,并通过实例展示了两者在线程状态及释放机制上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

挂起和释放线程

与suspend和resume的对比

– 线程挂起时的状态不同

package com.wenbin.locksipport;

import org.omg.PortableServer.THREAD_POLICY_ID;

import java.util.concurrent.locks.LockSupport;

public class Demo {
    public static void main(String[] args) {
        Thread supportThread = new Thread(() -> {
            System.out.println("park线程执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 挂起线程
            LockSupport.park();
            System.out.println("park线程继续执行");
        }, "locksupport-park");
        Thread suspendThread = new Thread(() -> {
            System.out.println("suspend线程执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 挂起线程
            Thread.currentThread().suspend();
            System.out.println("suspend线程继续执行");
        }, "Thread-suspend");
        supportThread.start();
        suspendThread.start();

        /*LockSupport.unpark(supportThread);
        suspendThread.resume();*/
    }
}

运行上面代码后,两个线程被挂起,通过jstack查看线程状态如下
在这里插入图片描述
两个线程都是被挂起,但是用suspend方法挂起的线程是RUNNABLE状态

– 释放线程

package com.wenbin.locksipport;

import org.omg.PortableServer.THREAD_POLICY_ID;

import java.util.concurrent.locks.LockSupport;

public class Demo {
    public static void main(String[] args) {
        Thread supportThread = new Thread(() -> {
            System.out.println("park线程执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            LockSupport.park();
            System.out.println("park线程继续执行");
        }, "locksupport-park");
        Thread suspendThread = new Thread(() -> {
            System.out.println("suspend线程执行");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Thread.currentThread().suspend();
            System.out.println("suspend线程继续执行");
        }, "Thread-suspend");
        supportThread.start();
        suspendThread.start();

        LockSupport.unpark(supportThread);
        suspendThread.resume();
    }
}

在这里插入图片描述
控制台的信息如下,因为使用suspend挂起的线程,释放方法先执行了,所以线程一直处于挂起状态,而LockSupport解决了这个问题。

结论

结合两个比较的结果,就能知道为什么JDK把suspend和resume标记为不推荐使用,如果不小心没有释放线程,jstack查看的时候是运行态,想解决就只能通过读代码完成。

----------END------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值