線程通訊的三個方法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

相關文章
相關標籤/搜索