java线程阻塞

时间:2009-08-14 18:26:36

标签: java multithreading

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

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

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

如果一个线程正在执行foo(),那么确保在线程休眠之前调用bar()?

TIA

3 个答案:

答案 0 :(得分:3)

线程总是可以被抢占(在Java中没有办法阻止它),但在foo返回之前,没有其他线程能够获取同一对象的锁。

请注意,“丢失CPU”的线程并不是“阻塞”通常所指的线程 - 通常,如果需要等待其他事情发生,则认为呼叫会被阻止。例如:

  • 从流阻塞中读取,直到有可用的数据(或到达流的末尾)
  • 获取锁定阻止,直到锁定可用

这些非常与耗尽时间片不同。

答案 1 :(得分:1)

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

但是,如果没有CPU,其他任何线程都无法调用您的“foo”方法。同样,同步“bar”会阻止它被调用,直到你对“foo”的调用完成(因为你拥有整个“foo”方法的锁定)。

答案 2 :(得分:1)

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

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