LockSupport.unpark()和LockSupport.park()的锁不住问题?求高手

问题:线程对象每次都是新new的,unpark已经消亡的线程之后,下一次新new的线程再park就锁不住了

线程类

public class Item extends  Thread {
    @Override
    public void run() {
        System.err.println(Thread.currentThread().getName() + "【Item线程】"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())+" 线程开始--------------------1秒后准备暂停");
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println(Thread.currentThread().getName() + "【Item线程】"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())+" 暂停");
        LockSupport.park();//暂停
        System.err.println(Thread.currentThread().getName() + "【Item线程】"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())+" park结束");
        System.err.println(Thread.currentThread().getName() + "【Item线程】"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date())+" 线程开始消亡");
    }
}

测试类

public class test01 {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("park和unpark的测试,每次都是new的新线程");
        System.out.println();
        for (int i = 1; i <= 3; i++) {
            if (i == 1) {
                System.out.println("第1次测试:先park,后unpark");
            } else if (i == 2) {
                System.out.println("第2次测试:先unpark,后park,再unpark");
            } else {
                System.out.println("第3次测试:先park,后unpark");
            }

            System.out.println("    "+Thread.currentThread().getName() + "【main线程】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()) + " 开始测试--------------------5秒后准备解除暂停");

            Item item = new Item();
            item.start();

            if (i == 2) {
                System.out.println("    "+Thread.currentThread().getName() + "【main线程】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()) + " 提前unpark");
                LockSupport.unpark(item);
            }


            Thread.sleep(5000);//测试过程5秒


            LockSupport.unpark(item);//颁发证书,解除暂停
            System.out.println("    "+Thread.currentThread().getName() + "【main线程】" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()) + " 解除暂停");


            Thread.sleep(2000);//跟下一次测试拉开时间距离,也让Item线程打印完
            System.out.println("--------------------------------------------------------------");
            System.out.println();

        }
    }
}

结果


线程对象每次都是新new的,第三次的时候,为啥锁不住了呢?

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值