黑马程序员技术交流社区

标题: 多线程间的通信 [打印本页]

作者: slience    时间: 2012-11-1 15:35
标题: 多线程间的通信
wait()和sleep()的有什么区别?
wait():释放资源,释放锁;//必须放在同步当中
sleep():释放资源,不释放锁;
等待的线程存放在线程池中;
notify()唤醒的是第一个等待的线程;
实现两个线程的同步的几个条件:
1,必须是同一把锁;
2.同步的资源必须上锁
线程间通信:就是多个线程在操作同一个资源,但操作的动作不同
eg:class Res
{
String name;
String sex;
private boolean flag =false;
}
class Input implements Runnable
{
Res r;
public run(Res r)
{
  int x = 0;
  while(true)
  {
  synchronized(r)
  {
  if(r.flag)
   r.wait();//默认是r.wait(0);
  if(x==0)
  {
   r.name = "maike";
   r.sex = "male";
  }
  else
  {
   r.name = "小王";
   r.sex = "female";
  }
   x=++x%2;
   r.notify();
  }
  }
   
}
}
class Output implements Runnable
{

public run()
{
  synchronized(r)
  {
  System.out.println(r.name+"--"+r.sex);
  }
}
}
class OutputInputDome
{
Reg r = new Reg();
Output out = new Output(r);
Input in = new Input(r);
Thread t1 = new Thread(out);
Thread t2 = new Thread(in);
t1.start();
t2.start();
}
3.等待唤醒机制
wait():
notify();
notifyAll();
都使用在同步中,因为要对持有监视器(锁)的线程操作;
所以要使用在同步中,因为只有同步才有锁
为什么这些操作线程的方法要定义object呢?
因为这些方法在操作同步中线程时,都必须要标示它们所操作线程的锁;
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒;
不可以对不同锁中的线程进行唤醒;
也就是说,等待和唤醒必须是同一个锁
而锁可以是任意对象,所以可以被任意对象调用的方法定义object类中;

作者: 刘进朝    时间: 2012-11-1 15:36
欧了,学习了.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2