【问题标题】:What will or won't cause a thread to block (a question from a test)什么会或不会导致线程阻塞(来自测试的问题)
【发布时间】:2010-03-20 22:14:05
【问题描述】:

我有一个测试,有一个问题我失去了一些分数,因为我无法回答它:

下列哪项不是导致线程阻塞的条件:

  • 调用对象的 wait() 方法
  • 等待 I/O 操作
  • 调用 sleep()
  • 调用yield()
  • 调用 join()

据我所知,所有这些都是阻塞调用:

  • 当某个东西调用 notify() 时,wait() 返回,然后阻塞直到那时
  • 如果线程正在等待 I/O 操作,那么它显然被阻塞了
  • sleep() 显然会阻塞,直到时间用完,或者有什么东西唤醒了线程
  • yield()“取消线程的其余时间片”(缺少更好的术语),并且仅在线程再次处于活动状态时返回
  • join() 阻塞,直到它等待的线程终止。

我错过了什么吗?

【问题讨论】:

  • 如果在守护线程上调用 join() 会阻塞当前线程吗?自己没试过,也许有人知道

标签: java multithreading


【解决方案1】:

产量()。它不会阻塞线程,我的意思是它不会将线程置于 BLOCK 状态,而是将线程置于 READY 状态 - 因此调度程序可以再次选择它来执行。尝试处理线程的状态。除了 yield 之外的所有操作都将线程置于 BLOCK 状态。

【讨论】:

  • 其实我正要选择那个,但我没有,认为从线程的角度来看,yield() 看起来像一个阻塞调用:线程无法继续在 yield() 完成之前。我没有想到线程可以处于的状态。谢谢。
  • 如果只有一个线程,那么yield 绝对什么都不做。
  • 重点就是线程状态。一件事是中断线程执行,另一件事是阻止线程执行。但看看状态,你就会找到答案。
【解决方案2】:

另外,在已经完成的线程上调用join() 不会阻塞。如果没有其他线程可以执行,sleep(0) 的行为将类似于 yield()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多