wait,notify,sleep,join和线程同步问题

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

wait,notify,sleep,join这几个方法很常用,这里涉及到多线程和同步问题,这里稍微解释一下.

1.wait和notify

这两个方法都是Object中的方法,放在一块是因为他们关系非常密切.

wait就是等待这个对象的同步锁,不过调用这个方法必须先获得这个对象的同步锁,就这一点很多人就搞晕了.

这里先解释一下这两个方法,然后给出一个小例子说明.

wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.假如不带参数的wait方法就只有等别人唤醒了,假如带一个参数的

化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.

notify:唤醒在等待该对象同步锁的线程(只唤醒一个,假如有多个在等待),但是notifyAll可以唤醒所有等待的线程,注重唤醒的时在notify之前wait的线程,之后的没有效果.

这里举一个通俗的例子,两个人共有一个卫生间(每次只能一个人用),他们都要刷牙和方便,他们是这样约定的,轮流用,第一个人先刷牙,然后第二个人刷牙...

class Syn

{

public static void main(String[] args) throws Exception

{

TwoPeople.ONE.start();

TwoPeople.TWO.start();

}

}

class TwoPeople extends Thread

{

private int i=0;

static Thread ONE=new TwoPeople(1);

static Thread TWO=new TwoPeople(2);

static Object washroom=new Object();

private TwoPeople(int i){this.i=i;}

public void run(){

synchronized(washroom){

try{

if(i==1){

brush(); //1

washroom.wait(); //2

release(); //6

washroom.notify(); //7

}

else{

brush(); //3

washroom.notify(); //4

washroom.wait(); //5

release(); //8

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航