线程通讯的三个方法wait notify notifyAll , sleep()和wait()的异同

线程通讯的例子:使用两个线程打印1-100,线程1 线程2 交替打印java

package org.zhanghl.examples;


/*
 * 线程通讯的例子:使用两个线程打印1-100,线程1 线程2 交替打印
 * 涉及到的三个方法
 * wait():一旦执行此方法,当前线程进入阻塞状态,并释放同步监视器
 * notify():执行此方法,会唤醒被wait的一个线程,若是有多个线程被wait,就唤醒优先级高的
 * notifyAll():执行此方法,就会唤醒全部被wait的线程。
 *
 * 说明:
 * 1.wait notify notifyAll 三个方法,必须使用在同步代码块,或同步方法中。
 * 2.wait notify notifyAll 三个方法的调用者必须是同步代码快或同步方法中的同步监视器。
 *      不然会出现 java.lang.IllegalMonitorStateException 异常
 * 3.wait notify notifyAll 三个方法 是定义在  java.lang.Object类中的
 *
 * 面试题:sleep()和wait()的异同
 * 1.相同点:一旦执行方法,均可以使得当前的线程进入阻塞状态。
 * 2.不一样点,1)两个方法声明的位置不一样:Thread类中声明sleep(),Object类中声明wait()
 *          2)调用的要求不一样:sleep() 能够再任何须要的场景下调用。wait()必须使用在同步代码块或同步方法中。
 *          3)关因而否释放同步监视器:若是两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁
 *
 * */
class Number implements Runnable {
    private int number = 1;
    private Object obj=new Object();
    @Override
    public void run() {
        while (true) {
            synchronized (obj) {
                obj.notify();
                if (number <= 100) {

                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + ":" + number);
                    number++;
                    try {
                        //使得调用wait()方法的线程进入阻塞状态 wait释放锁
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}

public class CommunicationTest {
    public static void main(String[] args) {
        Number number = new Number();
        Thread t1 = new Thread(number);
        Thread t2 = new Thread(number);

        t1.setName("线程1");
        t2.setName("线程2");

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

    }
}

 

 面试题:sleep()和wait()的异同面试

1.相同点:一旦执行方法,均可以使得当前的线程进入阻塞状态。ide

2.不一样点,1)两个方法声明的位置不一样:Thread类中声明sleep(),Object类中声明wait()线程

2)调用的要求不一样:sleep() 能够再任何须要的场景下调用。wait()必须使用在同步代码块或同步方法中。code

3)关因而否释放同步监视器:若是两个方法都使用在同步代码块或同步方法中,sleep不会释放锁,wait会释放锁 *get

相关文章
相关标签/搜索