我正在實現一個簡單的多線程示例,其中線程1在每1000ms後打印PING,線程2在每2000ms後打印PONG。如何在java中設置線程的時間?
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();
}
}
但是,輸出類似::
PONG
PING
PING
PING
PONG
PING
PING
PONG
PING
PING
PONG
PING
PING
PONG
PING
PONG
PONG
PONG
PONG
PONG
但是我預期的輸出應該像
PING
PING
PONG
PING
PING
PONG
PING
PING
PONG.....
應該在代碼中做些什麼改變?
你PING和PONG 10次,但PING更頻繁2次。所以它應該以一些PONGs結尾 –
當Ping和Pong同時運行時,首先是完全隨機的。兩者都從0ms開始,每兩秒「見面」。請解釋行爲的預期模型,然後我們可以提出一個實現。 – Daniel
我喜歡這些任務,在那裏有人試圖完成對真實世界應用程序完全無用的事情。或者他/她試圖以非常錯誤的方式達到理想目的和某種目的有用的行爲。除了可能學會你應該正確地同步一切,否則讓線程執行流程以自然的方式運行,而不是試圖成爲線程控制怪胎之外,究竟什麼是解決這個任務的成就呢?我的建議:忘記sleep()進行同步。目的,並學習如何做適當的同步。你正在窒息你的計劃而死。 – JensG