MariaDB多表聯查以及匯出cvs檔案
阿新 • • 發佈:2022-01-03
1.notify、wait、notifyall
notify方法是喚醒一個被阻塞的執行緒,若有多個執行緒被阻塞,先喚醒優先順序高的
notifyall是喚醒所有執行緒
wait是阻塞一個執行緒,該執行緒阻塞後會釋放鎖
這三個方法必須在同步程式碼塊或者同步方法中使用,並且呼叫者必須是同步程式碼塊或者同步方法的同步監視器
實現1~100執行緒1、2的輪流列印
package Test1; /** * @author rook1e * @creat 2022/1/12 */ class Number implements Runnable { private int number = 1; @Overridepublic void run() { while (true) { synchronized (this) { notify();//喚醒 if (number <= 100) { System.out.println(Thread.currentThread().getName() + ":" + number); number++; } else {break; } try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } public class ComTest { 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(); } }
這段程式碼有以下幾個很值得注意的點
0.synchronized(this) 只new了一個Number物件,並且執行緒共用一個numer物件,所以物件是唯一的,所以當前物件this也是唯一的,因此鎖唯一。
1.notify喚醒執行緒後,不會出現執行緒安全問題嗎?答案是不會,當執行緒1列印完1後阻塞,執行緒2拿到同步鎖,進入同步程式碼塊,喚醒執行緒1,但此時執行緒2已經拿到同步鎖,執行緒1無法進入同步程式碼塊,也就沒有執行緒安全問題
2.使用wait方法後,執行緒會失去同步鎖,執行緒進入阻塞狀態
sleep() 和 wait()的異同
相同點:一旦使用會讓執行緒進入阻塞狀態
不同點:1.宣告位置不同,Thread類中宣告sleep()方法,Object類中宣告wait()方法
2.呼叫要求不同,sleep方法可以在任何需要的場景下呼叫,wait方法只能使用在同步程式碼塊或者同步方法中
3.使用結果不同,sleep方法不會釋放同步監視器(鎖),wait方法使用後會釋放同步監視器。