从同步方法调用的非同步方法是否允许线程阻塞?Java线程阻塞
public synchronized void foo(){
someStuff();
someMoreStuff();
bar();
}
public void bar(){
//... does some things
}
如果一个线程正在执行foo()是否有任何方法来确保在线程休眠之前调用bar()?
TIA
从同步方法调用的非同步方法是否允许线程阻塞?Java线程阻塞
public synchronized void foo(){
someStuff();
someMoreStuff();
bar();
}
public void bar(){
//... does some things
}
如果一个线程正在执行foo()是否有任何方法来确保在线程休眠之前调用bar()?
TIA
线程总是可以捷足先登(有没有防止在Java中的方法),但没有其他线程就能之前foo
返回获取同一对象的锁。
请注意,“失去CPU”的线程通常不是“阻塞”的意思 - 通常情况下,如果需要等待其他事情发生,则调用被视为阻止。例如:
这些是很有不同于刚刚耗尽时间片。
你问是否有办法确保Java VM不占用CPU并让另一个线程执行?您可以将线程优先级设置为高,但这仍然不能提供保证。
虽然没有其他线程可以调用你的“foo”方法,但是你没有CPU。类似地,同步“bar”会阻止它在你对“foo”的调用完成之前被调用(因为你拥有整个“foo”方法的锁定)。
这个问题似乎是,如果其他线程可以自由调用bar(),而一个线程在执行foo()期间持有对象的锁定。具体来说,如果两个或多个线程可以同时运行bar()。
答案是任何线程都可以随时运行bar(),所以是的,可以有多个线程在任何时间点运行bar()。
感谢您的澄清,这东西不是微不足道的:) – javamonkey79 2009-08-14 19:50:42