我在java中尝试使用多线程,基本上我想创建两个线程,并让它们计入一个数字。
但当他们达到大约一半时,他们会睡一段时间。所以我想在IF循环中放置一个IF语句来查看它到达中途的时间然后如果有,它会使自己进入睡眠状态。
我正在运行一个单核cpu atm,因为我在学校的计算机上所以在理论上,当我把第一个线程睡觉时,第二个线程应该启动?
另外,是否可以将第一个线程从第二个线程置于休眠状态,反之亦然?
答案 0 :(得分:1)
您可以使用Thread.sleep(int milliseconds)
:
导致当前正在执行的线程进入休眠状态(暂时停止 执行)指定的毫秒数,受制于 系统定时器和调度程序的精度和准确性。线程 不会失去任何监视器的所有权。
至于让一个线程暂停另一个线程,你可以公开其他线程可以调用的方法来暂停其他线程的执行。
就像其他任何多线程程序一样,请留意race conditions。
至于你的另一个问题,单核处理器应该能够运行多个线程,因此核心数量(在这种情况下)并不重要。
答案 1 :(得分:0)
线程可能只会使自己使用Thread.sleep
进入睡眠状态。即使在单核CPU上运行,JVM也会为可运行的所有线程安排时间。如果您想要更好地控制每个线程运行的时间,您将需要查看java.util.concurrent
包中的信号量和其他锁定/调度机制。
提出更具体的问题,以获得有关项目陷入困境的帮助。
答案 2 :(得分:0)
当你开始让一个线程让另一个线程进入睡眠然后让自己进入睡眠状态时,你正在接近一个种族/死锁条件:
答案 3 :(得分:0)
我建议你看看这本书它涵盖了几乎所有关于java和并发/多线程的内容,包括编码原理和许多例子。 Book For Conucurrency In java
答案 4 :(得分:0)
问题的第一部分:
第二个线程可能在执行到达第一个线程中的sleep()语句时完成。这是因为JVM将CPU时间分配给线程,而不是基于每次启动时的时间,而是基于复杂的调度算法。调用Thread.sleep(1000)
时唯一能保证的是线程将在该点停止执行至少1000毫秒。
第二部分 - 让一个线程从另一个线程入睡 - 其他人已经很好地解决了这个问题。你需要注意竞争条件。