黑马程序员技术交流社区
标题:
关于线程的wait()方法..
[打印本页]
作者:
芦青
时间:
2013-4-14 18:10
标题:
关于线程的wait()方法..
本帖最后由 芦青 于 2013-4-15 18:13 编辑
class Xc implements Runnable
{
int piao=100;
public void run()
{
while(true)
{
synchronized(Xc.class)
{
if(piao>0)
{ try{wait();} catch(Exception e){}
System.out.println(Thread.currentThread()+"..."+piao--);
}
}
}
}
}
class Demo
{
public static void main(String[] args)
{
Xc x=new Xc();
Thread t1=new Thread(x);
Thread t2=new Thread(x);
t1.start();
t2.start();
}
}
疑问:t1和t2的线程,去执行的时候,为什么没有等待,我没有唤醒啊..
还有,在sleep()方法中,一个线程休息,但并没有放弃锁,别的线程进步来,但使用wait()方法,另一个线程还能进来执行..
是不是sleep()方法没有放弃锁,而wait()方法放弃了锁?
作者:
①人←①城市
时间:
2013-4-14 18:28
主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。
使用范围:wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
synchronized(x){
wait()
}
sleep必须捕获异常,而wait不需要捕获异常
作者:
沈浩
时间:
2013-4-14 18:32
你上面的代码中 线程根本就没等待 因为没有调用wait方法 你要标示是持有什么锁的线程要等待 它才会等待
synchronized(Xc.class)
{
if(piao>0)
{ try{Xc.class.wait();} catch(Exception e){}//要标示是持有Xc.class锁的线程调用wait()方法
System.out.println(Thread.currentThread()+"..."+piao--);
}
}
作者:
张洪慊
时间:
2013-4-14 19:08
1.为什么wait,notify,notifyall必须用在同步中?(API文档)
当前线程必须拥有此对象监视器(锁)。
该线程发布(放弃)对此监视器(锁)的所有权并等待,
直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。
然后 该线程将等到重新获得对监视器的所有权后才能继续执行。
2.为什么需要标识出 wait操作的 线程所持有的锁?
因为可能出现同步嵌套,出现多个锁
同一个锁上等待的线程,只能被同一个锁上的线程唤醒
3.sleep与wait(API)
sleep: 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
该线程不丢失任何监视器(锁)的所属权。
wait:在第一条已说明
作者:
黄玉昆
时间:
2013-4-15 12:07
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2