java的sleep()和wait()
比如有两个线程t1和t2,t1处于wait状态当t1被notify的时候t1是立马执行还是开始与t2竞争资源?sleep呢...
比如有两个线程 t1和t2 ,
t1处于wait状态
当t1被notify的时候
t1是立马执行 还是开始与t2竞争资源?
sleep呢 展开
t1处于wait状态
当t1被notify的时候
t1是立马执行 还是开始与t2竞争资源?
sleep呢 展开
展开全部
wait()、notify()、notifyAll()这三个方法是Object中的方法,跟锁类似。
当t1没有获取这个object时wait,其他线程释放object后叫notify,然后t1立即继续执行。
sleep()跟上面这三个不一样,是Thread中的方法,不需要等待资源被释放,sleep有一个时间传参,想让线程等待多会儿就等待多会儿,不需要其他线程唤醒。例如:
try{
t1.sleep(1000); //t1等待1秒后继续执行下面的内容
}catch(Exception e){}
当t1没有获取这个object时wait,其他线程释放object后叫notify,然后t1立即继续执行。
sleep()跟上面这三个不一样,是Thread中的方法,不需要等待资源被释放,sleep有一个时间传参,想让线程等待多会儿就等待多会儿,不需要其他线程唤醒。例如:
try{
t1.sleep(1000); //t1等待1秒后继续执行下面的内容
}catch(Exception e){}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
t1被notify了,也不会马上执行,甚至不会执行(因为还有其他的运行条件未满足,例如IO阻塞等),即使所有的条件都满足了,这只是代表t1进入了就绪状态,可以运行了,但是还要依赖于操作系统对CPU的分配,这存在很大的不确定性,记住:无人能确定何时能运行,千万不要妄图猜测。
t1都处于wait了,线程已经被挂起,sleep还有什么用呢?
t1都处于wait了,线程已经被挂起,sleep还有什么用呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Java多线程中Sleep与Wait的区别
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点:
1. Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
共同点:
1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
不同点:
1. Thread类的方法:sleep(),yield()等
Object的方法:wait()和notify()等
2. 每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
4. sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个要你学过操作系统的进程管理才可以说得清楚的,
但可以跟你说,当t1被notify的时候,t2就会sleep,然后就是t1开始执行
网上有很多视频教程,你搜几个来看一下吧,我就不贴出来了。免得被人说是卖广告
但可以跟你说,当t1被notify的时候,t2就会sleep,然后就是t1开始执行
网上有很多视频教程,你搜几个来看一下吧,我就不贴出来了。免得被人说是卖广告
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询