2014-03-29 91 views
0

我應該先創建3個線程,每3秒打印'A'秒,每4秒打印一次'B',每5秒打印一次'C'讓線程進入睡眠時間不同的時間

我這樣做,但他們改變了他們的訂單付出印刷和它是可疑的。但我認爲在第9秒他們可以混合......並罰款。請張貼yuur的意見。

public class MyThread extends Thread { 

    static int ID; 
    int id; 

    public MyThread() { 
     id = ID++; 
    } 

    public synchronized void run() { 
     char character = (char) (65 + id); 
     while (true) { 
      System.out.println(character); 
      try { 
       Thread.sleep(3000 + id * 1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     new MyThread().start(); 
     new MyThread().start(); 
     new MyThread().start(); 
    } 
} 

輸出:在評論一旁討論

A 
B 
C 
A 
B 
C 
A 
B 
A 
C 
B 
A 
....... 
+1

你可能不應該擴展'Thread',而是實現'Runnable'。一般應避免擴展'Thread'。 –

+0

請參閱[如何安排任務以定期間隔運行?](http://stackoverflow.com/questions/4544197/how-do-i-schedule-a-task-to-run-at-periodic-intervals ) –

+0

@BoristheSpider爲什麼? – Yoda

回答

1

作風問題,你是正確的顯示外觀的輸出;

A 0 seconds, thread start 
B 0 seconds, thread start 
C 0 seconds, thread start 
A 3 seconds 
B 4 seconds 
C 5 seconds 
A 6 seconds (2*3) 
B 8 seconds (2*4) 
A 9 seconds (3*3) 
C 10 seconds (2*5) 
B 12 seconds (3*4) 
A 12 seconds (4*3) 
... 
2

使用sleep存在一個普遍問題;它在一個任務的結束和下一個任務的開始之間進行安排。 不是之間的兩個任務的開始。

因此,每當您的任務運行時,它們都會在您希望它們運行的​​時候有所下降。

這通常是爲什麼sleep未用於按特定比例調度任務。

正如@Joachim所指出的,你的輸出看起來很好。下面是當每個線程應該打印的快速計算:

​​3210

不過我強烈建議您使用ScheudledExecutorService如下:

public static void main(final String[] args) throws Exception { 
    final ScheduledExecutorService ses = Executors.newScheduledThreadPool(3); 
    final class Work implements Runnable { 

     private final String name; 

     public Work(String name) { 
      this.name = name; 
     } 

     @Override 
     public void run() { 
      System.out.println(name); 
     } 
    } 
    ses.scheduleAtFixedRate(new Work("A"), 0, 3, TimeUnit.SECONDS); 
    ses.scheduleAtFixedRate(new Work("B"), 0, 4, TimeUnit.SECONDS); 
    ses.scheduleAtFixedRate(new Work("C"), 0, 5, TimeUnit.SECONDS); 
    ses.schedule(new Runnable() { 

     @Override 
     public void run() { 
      ses.shutdown(); 
     } 
    }, 1, TimeUnit.MINUTES); 
    ses.awaitTermination(1, TimeUnit.DAYS); 
} 

少數的Java 8 Lambda表達式:

public static void main(final String[] args) throws Exception { 
    final ScheduledExecutorService ses = Executors.newScheduledThreadPool(3); 
    ses.scheduleAtFixedRate(() -> System.out.println("A"), 0, 3, TimeUnit.SECONDS); 
    ses.scheduleAtFixedRate(() -> System.out.println("B"), 0, 4, TimeUnit.SECONDS); 
    ses.scheduleAtFixedRate(() -> System.out.println("C"), 0, 5, TimeUnit.SECONDS); 
    ses.schedule(() -> ses.shutdown(), 1, TimeUnit.MINUTES); 
    ses.awaitTermination(1, TimeUnit.DAYS); 
}