充分说明线程start了不一定能运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/86492458
 大家推荐个靠谱的公众号程序员探索之路,大家一起加油,这个公众号已经接入图灵 ​ 
方法目的:测试condition.signal();会把唤醒的线程加入到等待队列中
public static void main(String[] args) {
        ReentrantLock reentrantLock = new ReentrantLock();
        Condition condition = reentrantLock.newCondition();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    reentrantLock.lock();
                    condition.await();
                    System.out.println(Thread.currentThread().getName()+"我是那个await的线程");
                } catch (InterruptedException e) {
                    System.out.println("中断了");
                }finally {
                    reentrantLock.unlock();
                }
            }
        }).start();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    reentrantLock.lock();
                    System.out.println("111111");
                    Thread.sleep(10000);
                    System.out.println(Thread.currentThread().getName()+"我睡了10s");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    reentrantLock.unlock();
                }
            }
        }).start();
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    reentrantLock.lock();
//                    System.out.println("111111");
//                    Thread.sleep(10000);
//                    System.out.println("我睡了10s");
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }finally {
//                    reentrantLock.unlock();
//                }
//            }
//        }).start();
        reentrantLock.lock();
        condition.signal();
        reentrantLock.unlock();
    }

结果:

Thread-0我是那个await的线程

111111
Thread-1我睡了10s

可以看到一个现象,await那个线程直接运行了await下面的输出语句,这就意味着 我把线程唤醒然后直接就运行了,没有加入到等待

队列中???????????那单Dong lea欺骗了我们

实际分析一个  睡10s那个线程start之后没有抢到时间片,main线程直接将await线程唤醒那么就不需等待了,正解(Y)

猜你喜欢

转载自blog.csdn.net/yueloveme/article/details/86492458