一、 wait和notify 方法
Object lockWait=new Object(); lockWait.wait()或lockWait.notity 必须是在同步代码块,及有锁的代码块中并且 wait(),对象必须是被锁对象;
lockWait.wait(); 阻塞线程停止执行; lockWait.notify() 唤醒线程开始执行,
1、由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。
当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。
2、notify 和 notifyAll的区别
notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程
,选择哪个线程取决于操作系统对多线程管理的实现。notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。
如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll 方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生产者,以判断程序是否可以继续往下执行。
/** * Object lockWait=new Object(); lockWait.wait()或lockWait.notity 必须是在同步代码块,及有锁的代码块中并且 wait(),对象必须是被锁对象 * lockWait.wait(); 阻塞线程停止执行; lockWait.notify() 唤醒线程开始执行, * * 1、由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 * 当线程执行wait()方法时候,会释放当前的锁,然后让出CPU,进入等待状态。 * 2、notify 和 notifyAll的区别 * notify方法只唤醒一个等待(对象的)线程并使该线程开始执行。所以如果有多个线程等待一个对象,这个方法只会唤醒其中一个线程 * ,选择哪个线程取决于操作系统对多线程管理的实现。notifyAll 会唤醒所有等待(对象的)线程,尽管哪一个线程将会第一个处理取决于操作系统的实现。 * 如果当前情况下有多个线程需要被唤醒,推荐使用notifyAll 方法。比如在生产者-消费者里面的使用,每次都需要唤醒所有的消费者或是生产者,以判断程序是否可以继续往下执行。 * 3、 * * */ public class ObjectLockWaitService { // 控制 等待和执行 及(wait和notify) Object lockWait=new Object(); public void method01(){ synchronized(lockWait){ try { System.out.println("put 待待处理业务前!,"+Thread.currentThread().getName()); lockWait.wait(); System.out.println("put 我被放行,执行了!,"+Thread.currentThread().getName()); Thread.sleep(1000); lockWait.notify(); } catch (InterruptedException e) { e.printStackTrace(); } } } public void method02(){ synchronized(lockWait){ try { lockWait.notify(); Thread.sleep(1000); System.out.println("get 待待处理业务前!!,"+Thread.currentThread().getName()); lockWait.wait(); System.out.println("get 我被放行,执行了!!,"+Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } }
二、调用实例方法
public class UseObjectWaitService { /** * 调用 wait和notify 方法 * @param args */ public static void main(String[] args) { Object mainLock=new Object(); ObjectLockWaitService lockWaitService=new ObjectLockWaitService(); Thread th1=new Thread(()->{ lockWaitService.method01(); },"thread-1"); th1.start(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } Thread th2=new Thread(()->{ lockWaitService.method02(); },"thread-2"); th2.start(); try { th2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("我是主线程"); } }
th2.join:解释一下,是主线程等待子线程的终止。也就是说主线程的代码块中,如果碰到了 th2.join()方法,此时主线程需要等待(阻塞),等待子线程结束了(Waits for this thread to die.),才能继续执行 th2.join()之后的代码块。