【问题标题】:converging threads and thread priority (java)收敛线程和线程优先级(java)
【发布时间】:2011-03-13 06:12:14
【问题描述】:

假设我有两个线程在一个程序中运行。两个线程都到达一个节点(如在树或地图中),用户必须在其中输入数据才能使线程继续。通常,如果节点是同步的,那么首先到达该节点的线程将等待输入,同时阻止任何其他线程到达该节点。

问题是:

有没有办法让第二个线程(被锁在外面的人)通过线程数 1 来适应他?另外,是否可以在不导致线程 1 退出的情况下做到这一点?

我已经知道你可以有一个输入数据的时间限制,这样如果线程 1 在节点上停留的时间过长,它就会关闭,但是可以说线程 2 可以“播放”吗?

别介意,伙计们,我想我明白了,我的问题表达得很糟糕,但感谢您的尝试。

【问题讨论】:

  • 看来线程2需要线程1正在等待的信息。那么没有这些信息,线程 2 如何继续

标签: java multithreading


【解决方案1】:

如果我没看错你的问题,答案是java.util.concurrent.locks.Lock.tryLock()。只需使用它代替 synchronized 关键字即可。

【讨论】:

    【解决方案2】:

    为什么要锁定(同步)等待输入?

    只有在实际修改多个线程可以访问的内容时才应该锁定(同步)。

    编辑:更清楚一点:线程#2 必须等待的唯一原因是:

    A) 它需要修改线程#1 正在修改的内容。

    B) 它依赖于(需要阅读)线程 #1 正在修改的内容。

    否则,您的锁的范围太广了。

    【讨论】:

    • 对不起,我忘了说输入实际上正在写入文件。
    • 这有什么改变?线程#2 应该被阻塞的唯一原因是它是否试图做与线程#1 相同的事情,或者需要读取线程#1 正在修改的内容。
    • 那么线程#2 怎么可能“通过”线程#1?你的意思是你想保释并返回一个错误或什么?
    • 类似的东西,我实际上只是意识到我的问题用错了。在等待命令或类似的东西时,是否可以将线程放入优先级队列?
    • 您需要促进线程之间的通信,以便一个可以告诉另一个停止它正在做的事情并放弃锁定。或者有一个监督线程来做这些事情。我仍然不确定你想要做什么是完全清楚的。
    【解决方案3】:

    我不是如何编写代码的专家,但 Java Concurrency In Practice 涵盖了这个确切的场景以及如何使用 java.util.concurrent 中的类来构造它。这本书物超所值。

    http://www.javaconcurrencyinpractice.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多