【问题标题】:Check whether a Java thread is yielding检查 Java 线程是否正在让步
【发布时间】:2017-01-03 18:27:04
【问题描述】:

我正在编写一个定制的 Java 调度程序,它根据优先级策略调度线程(在调度期间设置和修改优先级)。

但是,使用Thread.yield(),调度程序可能会遇到死锁。例如,t1 正在调用 Thread.yield() 并放弃 CPU。但由于t1 仍处于RUNNABLE 状态,我的调度程序将继续尝试调度t1 并拖延其他人。

我正在寻找一些方法来知道一个线程是否“让步”,以便调度程序可以让另一个线程运行。有什么想法吗?

【问题讨论】:

  • yield 并不意味着线程应该无限期地暂停——只是它可能暂停了一会儿。正确使用它的开发者会假设线程会继续被调度并取得进展。当它被使用时(正如 javadocs 所提到的,它很少适合使用它!),它通常是一种确保一个线程不占用 CPU 的方法,not 作为一种停放线程直到满足某些条件。换句话说,如果您的调度程序继续调度t1,尽管调用了yield(),那么它工作正常。如果它没有,它就严重损坏了。
  • (说了这么多……我什至不认为 JVM 允许您定义自定义调度程序,粗略的搜索似乎证实了这一点。所以我不太确定你的意思.)
  • 在这里不要粗鲁,但您认为您的调度器会比 Linux/Windows 的调度器执行得更好吗?您所描述的基本上是设置优先级,让操作系统完成其余的工作。甚至 JVM 也放弃了 Java-land 调度的想法,转而支持 OS 调度。操作系统比您更清楚应该在系统中的每个进程中运行哪个线程,只需考虑在 linux 内核上进行线程调度的人数以及他们执行的优化量。我怀疑你能打败那个
  • @David Haim 目标不是替换原来的,而是控制线程的交错并尝试暴露特定类型的并发错误。请参阅 PCT(概率并发测试)算法。

标签: java multithreading concurrency deadlock


【解决方案1】:

Thread.currentThread() != threadInQuestion

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多