2011-08-18 79 views
2

我有一種情況,每分鐘運行一次thread1,每小時運行一次thread2。我怎樣才能做到這一點。與不同的睡眠時間同時運行兩個線程

目前我有一個工作代碼,每分鐘後運行thread1。

主要方法

static void main(string args[]){ 
     orderListner thread1 = new orderListner(); 
     thread1.start(); 
    } 

線程1

public static void orderListner extends thread{ 
     public void run(){ 
     while(true){ 
      process(); 
      thread.sleep(60000); 
     } 
     } 
    } 

現在我要開始爲結果新的線程它每隔一小時後運行。我怎樣才能同時實現(thread1將連續運行thread2應該每小時啓動一次)

+2

爲什麼不使用兩個定時器來代替? –

+0

使用時間任務。看看這裏http://download.oracle.com/javase/1.4.2/docs/api/java/util/TimerTask.html –

+0

如果你可以每分鐘做一次,你可以每隔一小時做一次。只要將睡眠時間乘以60.我錯過了什麼?請解釋你想更明確地做些什麼。 –

回答

1

更好的方式來使用線程類是使對象,實現Runnable而不是擴展線程。如果你不想創建另一個文件,只需創建一個匿名類。 (儘可能避免使用繼承是一種好習慣。)

這就是說,只需創建一個運行在小時的新線程並啓動它即可。我將使用你的線程方法。

static void main(string args[]){ 
      orderListner thread1 = new orderListner(); 
      orderListner2 thread2 = new orderListner2(); 
      thread1.start; 
      thread2.start; 
     } 

線程1是相同的,線程2是

public static void orderListner2 extends thread{ 
     void run(){ 
     while(true){ 
      process(); 
      thread.sleep(3600000); 
     } 
     } 
    } 
+0

如果我錯了,請糾正我。在main方法中我們定義了thread1.start;這意味着遊標不會返回到此類,直到thread1終止,以啓動thread2。 – gmeka

+0

如果您注意到線程類中定義的方法名稱以及調用啓動線程類的方法,它們是不一樣的。線程代碼在名爲'run'的方法中定義,而線程實際上是通過調用名爲'start'的方法啓動的。在'start'內部會調用各種黑魔法,這意味着'run'方法中的代碼是從另一個代碼運行__separately__,並且'start'方法幾乎立即返回到main。之後,第二個線程以相同的嚮導方式啓動;) – davogotland

+0

睡眠線程並不是一個計劃執行的好方法。更好的方法是使用定時器或調度程序 - 查看@ mre的答案。 –

11

我建議你使用ScheduledExecutorService來集中這些任務。


public final class ScheduledExecutorServiceDemo { 
    private static final ScheduledExecutorService exec = 
     Executors.newScheduledThreadPool(2); 

    public static void main(String[] args){ 
     // Schedule first task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.MINUTES); 

     // Schedule second task 
     exec.scheduleAtFixedRate(new Runnable(){ 
      @Override 
      public void run() { 
       // do stuff 
      }}, 0, 1, TimeUnit.HOURS); 
    } 
} 
+0

這個例子告訴你需要完成笏。 http://gallemore.blogspot.com/2007/05/java-threading-scheduledexecutorservice.html快樂編碼! – cheekoo

+0

@ user877333,另請參閱:[Executors](http://download.oracle.com/javase/tutorial/essential/concurrency/executors.html)教程。 – mre

2

到目前爲止做得很好! :)

你可以再次做同樣的事情。我的意思是說,你創建了一個代表你的第二個線程的新類(我們可以稱這個類爲SecondListener)。它應該看起來像OrderListener,但睡眠時間應該改變爲1小時。

然後您只需修改您的主要方法,以便它創建SecondListener類的一個對象,並像啓動OrderListener一樣啓動線程。

如果SecondListener在第一次運行之前不運行第一次運行是很重要的,那麼您可以在SecondListener的進程之前執行睡眠。

最後還有一個關於睡眠時間的小建議:爲了可讀性,將它們表達爲方程式。因此,而不是60000,輸入1000 * 60.而不是3600000類型1000 * 60 * 60 :)

+0

如果第一個process()方法需要50秒執行,該怎麼辦?上述程序是否按預期行事? – cheekoo

+0

的確,我同意可讀性。 – WillHaack

+0

@cheekoo是的,它會繼續工作,當你開始一個新的線程時,你會得到一個新的進程。你有2個進程運行第二個不關心是否第一個完成。 – WillHaack