您的位置:首页 > 职场人生

黑马程序员_JavaSE基础14 之 线程间通信 等待唤醒机制 多生产多消费者 ...

2012-09-13 10:08 483 查看
----------------------      android培训、java培训、期待与您交流!   ---------------------

JavaSE_14  笔记 

Java语言基础之  线程间通信 等待唤醒机制 多生产多消费者 ...

 

1、 线程间通讯:就是多个人线程操作同一个资源。

比如 输入煤和输出煤,操作的都是煤炭资源;隶属于两个线程,由于CPU有切换,所以会导致输入的煤对象和输出的煤对象不一样的情况。

①解决方式一:加上锁,来解决不变性的问题。即input 中的run()加锁; output 中的 run()加锁 ;

答案:不能解决问题,因为分别属于两个线程,不属于同一个锁。所以只能用唯一的对象resource作为参数进行传递。

②解决方式二:使用等待唤醒机制,来解决间隔输出,就是你放入一个数据,我取出一个数据。

 

2、多线程通讯时非常重要的机制——等待唤醒机制

 ① wait() :让线程处于冻结状态,被wait的线程会被存储到线程池中。

 ② notify() : 唤醒线程池中任意一个线程。

 ③ notiry() : 唤醒线程池中所有线程。

注意:这些方法都必须定义在同步中。因为这些方法是用于操作线程状态的方法,必须要明确到底操作的是哪个锁上的线程。即 一个锁中的等待和唤醒 不影响 另一个锁中的等待和唤醒。

//事例:输入线程往资源库中输入资源,输出线程从资源库中取出数据:

class  

{

public static void main(String[] args) 

{

Resource r=new Resource();

Input in=new Input(r);

Output out=new Output(r);

Thread t1=new Thread(in);

Thread t2=new Thread(out);

t1.start();

t2.start();

 

}

}

class Resource

{

String name;

String sex;

boolean flag=false; //等待唤醒机制的标志,默认是资源库中没有资源

}

class Input implements Runnable

{

Resource r;

int x=0;

Input(Resource r)

{

this.r=r;

}

public void run()

{

while(true)

{

synchronized(r)

{

if(r.flag)  // 若资源库中有资源,就等待

try{r.wait();}catch(InterruptedException e){}

if(x=0)

{

r.name="mike";

r.sex="man";

}

else

{

r.name="丽丽";

r.sex="女";

}

r.flag=true;

r.notify();

}

 

x=(x+1)%2;

}

}

}

class Output implements Runnable

{

Resource r;

Output(Resource r)

{

this.r=r;

}

public void run()

{

synchronized(r)

{

if(!flag)

try{r.wait();}catch(InterruptedException e){}

while(true)

{

System.out.println("name="+name+"sex="+sex);

}

flag=false;

r.notify();

}

 

}

 

}

 

 

3、

 

 

 

  

4、

 

5、

 

 

 


 

 

6、

 


 

 

7、

 



8、

 

 

9、

  

2012/9/09     By  Mary_k

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐