一 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(); } }