一 wait方法怎么用?
package com.aaa.threaddemo; /* * 多線程中的wait方法? public final void wait() throws InterruptedException { wait(0); } 1 隸屬於object,因為Java希望把並發控制做到每一個Object里 2 調用wait方法,線程會放棄對象鎖,進入等待此對象的等待對象池。 3 只有針對此對象調用notify方法后,本線程才進入對象鎖定池,准備獲取對象鎖,進行運行狀態。否則就是一直掛起狀態。 * * */ public class WaitDemo { public static void main(String[] args) throws InterruptedException { // 新建兩個線程 測試wait方法。 new Thread(new Runnable() { public void run() { // 4.synchronized后面括號里是類,此時,線程獲得的是對象鎖. synchronized (WaitDemo.class) { try { System.out.println("線程一開始"); //wait 方法 線程會放棄對象鎖,進入等待此對象的等待鎖定池,此時線程掛起。 WaitDemo.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("線程一結束"); } } }).start(); new Thread(new Runnable() { public void run() { synchronized (WaitDemo.class) { System.out.println("線程二開始"); //只有針對此對象調用notify方法后,本線程才進入對象鎖定池,准備獲取對象鎖,進入運行狀態。 //如果不調用這個方法,線程永遠都是刮起的狀態。 WaitDemo.class.notify(); System.out.println("線程二結束了"); } } }).start(); } }
二 測試notify的作用
package com.aaa.threaddemo; /* * 多線程中的wait方法? public final void wait() throws InterruptedException { wait(0); } 1 隸屬於object,因為Java希望把並發控制做到每一個Object里 2 調用wait方法,線程會放棄對象鎖,進入等待此對象的等待對象池。 3 只有針對此對象調用notify方法后,本線程才進入對象鎖定池,准備獲取對象鎖,進行運行狀態。否則就是一直掛起狀態。 * * */ public class WaitDemo { public static void main(String[] args) throws InterruptedException { // 新建兩個線程 測試wait方法。 new Thread(new Runnable() { public void run() { // 4.synchronized后面括號里是類,此時,線程獲得的是對象鎖. synchronized (WaitDemo.class) { try { System.out.println("線程一開始"); //wait 方法 線程會放棄對象鎖,進入等待此對象的等待鎖定池,此時線程掛起。 WaitDemo.class.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("線程一結束"); } } }).start(); new Thread(new Runnable() { public void run() { synchronized (WaitDemo.class) { System.out.println("線程二開始"); //只有針對此對象調用notify方法后,本線程才進入對象鎖定池,准備獲取對象鎖,進入運行狀態。 //如果不調用這個方法,線程永遠都是刮起的狀態。 // WaitDemo.class.notify(); System.out.println("線程二結束了"); } } }).start(); } }