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

本文详细解析了Java中线程间的协作机制,通过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     

 

转载于:https://www.cnblogs.com/guboju/p/7244051.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值