Java Object 对象上的wait(),notify(),notifyAll()方法理解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Object 对象上的wait(),notify(),notifyAll()方法理解相关的知识,希望对你有一定的参考价值。

第一阶段理解(2017-7-27):

Java 将wait(),notify(),notifyAll()方法放在Object对象上,也就是说任何一个对象都可以调用这个方法,这与”任何一个对象都有一个内置锁,可以用于线程同步“是照应的。因此,当某个线程要释放cpu争夺权,让自己进入等待状态时,调用 某个锁(对象)上的wait()方法,也就是让当前线程等待其它线程调用该锁上的notify()或notify()方法。线程间通过同步锁来实现等待与唤醒协作。简单例子:

 

 1 package com.lyyc.thread.sample;
 2 
 3 
 4 import org.junit.Test;
 5 
 6 public class ThreadStateSample {
 7     
 8     @Test
 9     public void test() throws Exception {
10         int threadCount=10;
11         Action action=new Action();
12     Thread[] actions=new Thread[threadCount];
13     for(int i=0;i<threadCount;i++){
14         actions[i]=new Thread(action);
15         actions[i].start();
16     }
17     
18     while(true){
19     for(Thread t:actions){
20         System.out.println(t.getName()+":"+t.getState());
21     }
22     Thread.sleep(2000);
23         synchronized (action.getLock()) { //首先的获得同步锁,才能调用该锁的wait()/notify()/notifyAll()方法 
24             action.getLock().notifyAll(); //锁对象上调用notifyAll(),同志其它线程进入Runnable状态
25         }
26     }
27     
28     }
29 }
30 
31 class Action implements Runnable{
32 
33     public Object lock=new Object();
34     public Object getLock(){
35         return lock;
36     }    
37     @Override
38     public void run() {
39         try {
40             synchronized (lock) {
41                 Thread.sleep(2000);
42                 lock.wait();
43             }
44         } catch (InterruptedException e) {
45             // TODO Auto-generated catch block
46             e.printStackTrace();
47         }
48     }
49 
50 }
51     

 

以上是关于Java Object 对象上的wait(),notify(),notifyAll()方法理解的主要内容,如果未能解决你的问题,请参考以下文章

Java Object对象中的wait,notify,notifyAll的理解

Java之Object对象中的wait()和notifyAll()用法

Java多线程基础之wait,notify

Java并发之线程间协作Object的wait()notify()notifyAll()

Java 多线程编程之:notify 和 wait 用法

JAVA进阶之路-Object中的wait notify notifyall方法