是否有可能将线程自己睡眠?
我正在用java测试多线程,基本上我想做两个线程,并让它们数到一个数。是否有可能将线程自己睡眠?
但是当他们到达大约一半的时候,他们会睡一段时间。所以我正在考虑在FOR循环中放置一条IF语句,以查看它何时到达一半,然后如果有,它会自己睡觉。
我正在运行一个单核心CPU atm,因为我在学校的电脑上,所以在theroy,当我把第一个线程睡觉,第二个应该开始?
此外,是否有可能把第一个线程睡觉,从第二个,反之亦然?
可以使用Thread.sleep(int milliseconds)
:
使当前执行的线程休眠(暂时停止 执行)为指定的毫秒数,但须 精度和准确度的系统的Ti mers和调度程序。线程 不会丢失任何监视器的所有权。
至于使一个线程暂停另一个线程,您可以公开其他线程可以调用的方法来暂停其他线程的执行。
就像任何其他多线程程序,请留意race conditions。
至于你的其他问题,单核处理器应该能够运行多个线程,所以核心数量(在这种情况下)并不重要。
线程只能使用Thread.sleep
使自己睡眠。即使在单核CPU上运行,JVM也会为所有可运行的线程安排时间。如果您想要更好地控制每个线程运行的时间,您需要查看java.util.concurrent
包中的信号量和其他锁定/调度机制。
询问更具体的问题,以获得有关您在项目中卡住的位置的帮助。
你得到非常接近的种族/死锁情况,当你开始有一个线程把另一个睡觉,然后有自己入睡:
对于你的问题的第一部分:
这有可能是第二个线程可通过执行一次完成到达的第一个线程睡眠()语句。这是因为JVM会根据每个启动时间为线程分配CPU时间,而不是基于复杂的调度算法。当您致电Thread.sleep(1000)
时,唯一保证的是该线程将在该点停止执行至少1000毫秒。第二部分 - 让另一条线从另一条线入睡 - 已被其他人解决。你需要注意比赛条件。