A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© slience 中级黑马   /  2012-11-1 15:35  /  1680 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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类中;

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
欧了,学习了.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马