2009-08-14 212 views
1

从同步方法调用的非同步方法是否允许线程阻塞?Java线程阻塞

public synchronized void foo(){ 
someStuff(); 
someMoreStuff(); 
bar(); 
} 

public void bar(){ 
//... does some things 
} 

如果一个线程正在执行foo()是否有任何方法来确保在线程休眠之前调用bar()?

TIA

回答

3

线程总是可以捷足先登(有没有防止在Java中的方法),但没有其他线程就能之前foo返回获取同一对象的锁。

请注意,“失去CPU”的线程通常不是“阻塞”的意思 - 通常情况下,如果需要等待其他事情发生,则调用被视为阻止。例如:

  • 从流块读,直到有(到达或流的末尾)的一些可用的数据
  • 获取锁块,直到锁可用

这些是很有不同于刚刚耗尽时间片。

+0

感谢您的澄清,这东西不是微不足道的:) – javamonkey79 2009-08-14 19:50:42

1

你问是否有办法确保Java VM不占用CPU并让另一个线程执行?您可以将线程优先级设置为高,但这仍然不能提供保证。

虽然没有其他线程可以调用你的“foo”方法,但是你没有CPU。类似地,同步“bar”会阻止它在你对“foo”的调用完成之前被调用(因为你拥有整个“foo”方法的锁定)。

1

这个问题似乎是,如果其他线程可以自由调用bar(),而一个线程在执行foo()期间持有对象的锁定。具体来说,如果两个或多个线程可以同时运行bar()。

答案是任何线程都可以随时运行bar(),所以是的,可以有多个线程在任何时间点运行bar()。