第一阶段理解(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
时间: 2024-12-28 20:54:56