java线程问题
1.interrupt()方法是干嘛的2.stop()结束线程,和run()执行完毕有什么区别.为什么不推荐使用stop,而是自己设条件break;3.书上说yelid(...
1.interrupt()方法是干嘛的
2.stop()结束线程,和run()执行完毕有什么区别.为什么不推荐使用stop,而是自己设条件break;
3.书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源, 又说没有任何机制保证会这样。 why?感觉很矛盾 展开
2.stop()结束线程,和run()执行完毕有什么区别.为什么不推荐使用stop,而是自己设条件break;
3.书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源, 又说没有任何机制保证会这样。 why?感觉很矛盾 展开
3个回答
展开全部
interrupt():中断线程
stop():强迫线程停止执行。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级的线程有执行的机会。----这句是重点
3.书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源, 又说没有任何机制保证会这样。----------没有任何机制保证执行yield()的线程一定会把资源让给其它线程。打个比方:两个人抢东西,A抢到了B没有,再把东西放回去重抢,说不定还是A抢到B没有。没有任何机制保证放回去后B一定能抢到
stop():强迫线程停止执行。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。yield()只能使同优先级的线程有执行的机会。----这句是重点
3.书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源, 又说没有任何机制保证会这样。----------没有任何机制保证执行yield()的线程一定会把资源让给其它线程。打个比方:两个人抢东西,A抢到了B没有,再把东西放回去重抢,说不定还是A抢到B没有。没有任何机制保证放回去后B一定能抢到
展开全部
1.interrupt()方法是干嘛的
interrupt是终止睡眠线程用的,比如线程A和线程B,线程A处于运行态,线程B处于非运行态,这时线程A想终止线程B,就用interrupt方法。
2.
(1)stop()结束线程,和run()执行完毕有什么区别
stop()结束线程,有可能只执行run方法中的某部分,而run()执行完毕,会运行该方法中的所有代码。
(2)为什么不推荐使用stop,而是自己设条件break;
stop会造成数据不一致问题,比如在run方法中,有synchronized{a=1;b=2;},当程序执行到a=1的时候,由于时间片刚好到,所有当前线程A处于等待状态,而另一个线程B获得执行权后,调用A.stop()方法后,则线程A被终止,这时b的值并没有被赋值,会造成数据的不一致性,所以不推荐使用stop方法,当然stop方法还有许多其他的问题,比如会释放了它所拥有的锁。
3.
(1)书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源
Thread中yield()是让当前线程暂停,转入就绪状态,让系统的线程调度器重新调度一次。
(2)为什么又说没有任何机制保证会这样。
很好理解,比如你的程序就只有一个线程,那么调用yield()方法后,则当前线程暂停,进入就绪状态,这时并没有其他的线程,所有JVM又调用该线程。
再比如你的程序有两个线程,分别为线程A和线程B,但线程A的优先级比线程B的高,这时当前执行的线程A调用yield()方法后,则当前线程暂停,进入就绪状态,但由于线程A的优先级比线程B的高,所有线程A又进行执行状态。
interrupt是终止睡眠线程用的,比如线程A和线程B,线程A处于运行态,线程B处于非运行态,这时线程A想终止线程B,就用interrupt方法。
2.
(1)stop()结束线程,和run()执行完毕有什么区别
stop()结束线程,有可能只执行run方法中的某部分,而run()执行完毕,会运行该方法中的所有代码。
(2)为什么不推荐使用stop,而是自己设条件break;
stop会造成数据不一致问题,比如在run方法中,有synchronized{a=1;b=2;},当程序执行到a=1的时候,由于时间片刚好到,所有当前线程A处于等待状态,而另一个线程B获得执行权后,调用A.stop()方法后,则线程A被终止,这时b的值并没有被赋值,会造成数据的不一致性,所以不推荐使用stop方法,当然stop方法还有许多其他的问题,比如会释放了它所拥有的锁。
3.
(1)书上说yelid()是礼让,是让当前执行线程停下来给别的线程资源
Thread中yield()是让当前线程暂停,转入就绪状态,让系统的线程调度器重新调度一次。
(2)为什么又说没有任何机制保证会这样。
很好理解,比如你的程序就只有一个线程,那么调用yield()方法后,则当前线程暂停,进入就绪状态,这时并没有其他的线程,所有JVM又调用该线程。
再比如你的程序有两个线程,分别为线程A和线程B,但线程A的优先级比线程B的高,这时当前执行的线程A调用yield()方法后,则当前线程暂停,进入就绪状态,但由于线程A的优先级比线程B的高,所有线程A又进行执行状态。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
PS:小错误一大堆!
你这样的写法,本身就是不对的,看来你还是没有明白notify()和wait()的用法。针对你的问题来说,你必须在reStart()方法前加上synchronized关键字!
wait()和notify():
一般用在synchronized机制中
例如:
线程a
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.dosomething();
}
当线程a获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程a就wait()。
在另一线程b中,如果b更改了某些条件,使得线程a的condition条件满足了,就可以唤醒线程a:
线程b
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。
调用obj.wait()后,线程a就释放了obj的锁,否则线程b无法获得obj锁,也就无法在synchronized(obj) 代码段内唤醒a.
当obj.wait()方法返回后,线程a需要再次获得obj锁,才能继续执行。
如果a1,a2,a3都在obj.wait(),则b调用obj.notify()只能唤醒a1,a2,a3中的一个(具体哪一个由jvm决定)。
obj.notifyall()则能全部唤醒a1,a2,a3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,a1,a2,a3只有一个有机会获得锁继续执行,例如a1,其余的需要等待a1释放obj锁之后才能继续执行。
当b调用obj.notify/notifyall的时候,b正持有obj锁,因此,a1,a2,a3虽被唤醒,但是仍无法获得obj锁。直到b退出synchronized块,释放obj锁后,a1,a2,a3中的一个才有机会获得锁继续执行。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
你这样的写法,本身就是不对的,看来你还是没有明白notify()和wait()的用法。针对你的问题来说,你必须在reStart()方法前加上synchronized关键字!
wait()和notify():
一般用在synchronized机制中
例如:
线程a
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.dosomething();
}
当线程a获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程a就wait()。
在另一线程b中,如果b更改了某些条件,使得线程a的condition条件满足了,就可以唤醒线程a:
线程b
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。
调用obj.wait()后,线程a就释放了obj的锁,否则线程b无法获得obj锁,也就无法在synchronized(obj) 代码段内唤醒a.
当obj.wait()方法返回后,线程a需要再次获得obj锁,才能继续执行。
如果a1,a2,a3都在obj.wait(),则b调用obj.notify()只能唤醒a1,a2,a3中的一个(具体哪一个由jvm决定)。
obj.notifyall()则能全部唤醒a1,a2,a3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,a1,a2,a3只有一个有机会获得锁继续执行,例如a1,其余的需要等待a1释放obj锁之后才能继续执行。
当b调用obj.notify/notifyall的时候,b正持有obj锁,因此,a1,a2,a3虽被唤醒,但是仍无法获得obj锁。直到b退出synchronized块,释放obj锁后,a1,a2,a3中的一个才有机会获得锁继续执行。
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询