是否有可能将线程自己睡眠?

问题描述:

我正在用java测试多线程,基本上我想做两个线程,并让它们数到一个数。是否有可能将线程自己睡眠?

但是当他们到达大约一半的时候,他们会睡一段时间。所以我正在考虑在FOR循环中放置一条IF语句,以查看它何时到达一半,然后如果有,它会自己睡觉。

我正在运行一个单核心CPU atm,因为我在学校的电脑上,所以在theroy,当我把第一个线程睡觉,第二个应该开始?

此外,是否有可能把第一个线程睡觉,从第二个,反之亦然?

可以使用Thread.sleep(int milliseconds)

使当前执行的线程休眠(暂时停止 执行)为指定的毫秒数,但须 精度和准确度的系统的Ti mers和调度程序。线程 不会丢失任何监视器的所有权。

至于使一个线程暂停另一个线程,您可以公开其他线程可以调用的方法来暂停其他线程的执行。

就像任何其他多线程程序,请留意race conditions

至于你的其他问题,单核处理器应该能够运行多个线程,所以核心数量(在这种情况下)并不重要。

线程只能使用Thread.sleep使自己睡眠。即使在单核CPU上运行,JVM也会为所有可运行的线程安排时间。如果您想要更好地控制每个线程运行的时间,您需要查看java.util.concurrent包中的信号量和其他锁定/调度机制。

询问更具体的问题,以获得有关您在项目中卡住的位置的帮助。

你得到非常接近的种族/死锁情况,当你开始有一个线程把另一个睡觉,然后有自己入睡:

http://en.wikipedia.org/wiki/Deadlock#Necessary_conditions

我建议你看一看这本书它涵盖了几乎所有关于Java和并发/多线程的内容,包括编码原理和许多例子。 Book For Conucurrency In java

对于你的问题的第一部分:

这有可能是第二个线程可通过执行一次完成到达的第一个线程睡眠()语句。这是因为JVM会根据每个启动时间为线程分配CPU时间,而不是基于复杂的调度算法。当您致电Thread.sleep(1000)时,唯一保证的是该线程将在该点停止执行至少1000毫秒。第二部分 - 让另一条线从另一条线入睡 - 已被其他人解决。你需要注意比赛条件。