java 多线程——wait() ,sleep()

对于sleep()方法,我们首先要知道该方法是属于Thread类中的。

而wait()方法,则是属于Object类中的。

sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

在调用sleep()方法的过程中,线程不会释放对象锁。

而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

获取对象锁进入运行状态。

package com.ange.demo.thread;

public class ThreadTestWaitAndSleep {
    //https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html wait and sleep的区别
    static Thread t1, t2 = null;

    public static void main(String[] args) {

        System.out.print("hello");

        t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                synchronized (ThreadTestWaitAndSleep.class) {
                    while (i < 30) {
                        i++;
                        System.out.println("t1:" + i);
                        if (i == 10) {
                            //这里join 在线程1中执行,使线程2先执行完再执行线程1
                            t2.start();
                            System.out.println("t1:t2开始执行,由于锁被t1持有,t2在阻塞");
                        }
                        if (i == 20) {
                            try {
                                //调用wait()方法,线程会放弃对象锁,进入等待此对象的等待锁定池
                                System.out.println("t1:进入等待状态");
                                ThreadTestWaitAndSleep.class.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }

                    }

                }

            }
        });

        t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                synchronized (ThreadTestWaitAndSleep.class) {
                    while (i < 30) {
                        i++;
                        System.out.println("t2www:" + i);
                        if (i == 20) {
                            System.out.println("t2www:在t2通知解除阻塞,t1继续执行");
                            ThreadTestWaitAndSleep.class.notify();
                        }
                    }

                }
            }
        });
        t1.start();
    }
}

本例子中,t1先开始执行,当t1 的i==10时,调用t2 start(),由于t1持有锁对象,t2进入阻塞状态等待锁,t1继续执行,到i==20时,t1中ThreadTestWaitAndSleep.class.wait();使线程会放弃对象锁,进入等待此对象的等待锁定池,t2得到锁,执行完后调用

对象调用notify()方法后t1线程才进入对象锁定池准备,如果不通知,t2执行完后,t1将一直等待。

结果如下:

hellot1:1
t1:2
t1:3
t1:4
t1:5
t1:6
t1:7
t1:8
t1:9
t1:10
t1:t2开始执行,由于锁被t1持有,t2在阻塞
t1:11
t1:12
t1:13
t1:14
t1:15
t1:16
t1:17
t1:18
t1:19
t1:20
t1:进入等待状态
t2www:1
t2www:2
t2www:3
t2www:4
t2www:5
t2www:6
t2www:7
t2www:8
t2www:9
t2www:10
t2www:11
t2www:12
t2www:13
t2www:14
t2www:15
t2www:16
t2www:17
t2www:18
t2www:19
t2www:20
t2www:在t2通知解除阻塞,t1继续执行
t2www:21
t2www:22
t2www:23
t2www:24
t2www:25
t2www:26
t2www:27
t2www:28
t2www:29
t2www:30
t1:21
t1:22
t1:23
t1:24
t1:25
t1:26
t1:27
t1:28
t1:29
t1:30

发布了19 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ange_li/article/details/87360040