gpt4 book ai didi

java - 如何在java中设置线程的时间?

转载 作者:行者123 更新时间:2023-11-29 07:06:15 25 4
gpt4 key购买 nike

我正在实现一个简单的多线程示例,其中线程 1 每 1000 毫秒打印一次 PING,线程 2 每 2000 毫秒打印一次 PONG。

public class T extends Thread 
{
public void run()
{
int i =10;
while(i>0)
{
if(Thread.currentThread().getName().equals("T1"))
{
System.out.println("\nPING");
try {Thread.sleep(1000);}
catch (InterruptedException e) {e.printStackTrace();}
}
else if (Thread.currentThread().getName().equals("T2"))
{
System.out.println("\nPONG");
try {Thread.sleep(2000);}
catch (InterruptedException e) {e.printStackTrace();}
}
i--;
}
}

public static void main(String[] args)
{
Thread t1 = new T();
Thread t2 = new T();
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
}
}

但是输出就像::

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

乒乓球

但我的预期输出应该是这样的

PING
PING
PONG
PING
PING
PONG
PING
PING
PONG.....

应该对代码进行哪些更改?

最佳答案

假设两个线程都在时间 0 开始,并且无论出于何种(线程调度)原因,PONG 首先启动。

PONG (now wait 2000) // 0 has elapsed
PING (now wait 1000) // 0 has elapsed
PING (now wait 1000) // 1000 has elapsed
PING (now wait 1000) // 2000 has elapsed
PONG (now wait 2000) // 2000 has elasped
... and so on

如果你想要PING然后一个PONG,考虑使用一些通知机制(信号量,coutdown latches,等等)。不要依赖 sleep()

关于java - 如何在java中设置线程的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com