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