2012-07-08 57 views
4

我想使用Java中的執行器服務以並行方式安排相同的命令。我編寫了一個線程池執行程序的包裝器,它使用並行計數將命令調度爲參數,並在for循環中調度命令(即多次執行相同的實例)。多次向Java執行器服務提交相同的(Runnable)命令

這種方法是否正確?有沒有建議的方式來做到這一點?我使用spring來創建這些bean。

+0

爲什麼不使用'ScheduledExecutorService'? – user1329572 2012-07-08 12:52:36

+0

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html檢查方法「scheduleAtFixedRate」和「scheduleWithFixedDelay」 – 2012-07-08 12:54:34

+0

我使用Scheduled Executor服務和調度在固定速率。但是,我並沒有安排一個命令,而是希望它以平行的方式排定,例如,它應該在第1秒運行5次,在第2秒運行5次,在第3秒運行5次,而不是在第1秒運行,在第2秒運行。 – u07103 2012-07-08 14:15:13

回答

2

您可以使用ScheduledExecuterService如下:

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

public class ScheduledExecutorTest { 

    private final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

    public static void main(final String[] args) throws InterruptedException { 
     scheduler.scheduleAtFixedRate(new Runnable() { 
      public void run() { 
       System.out.println("executed"); 
      } 
     }, 0, 1, TimeUnit.SECONDS); 


     Thread.sleep(10000); 
     scheduler.shutdownNow(); 
    } 

} 

這將執行run方法每秒立即啓動。

通過這種方法,你可以多次將其添加到scheduledExecuterService

Runnable command = new Runnable() { 
    public void run() { 
     System.out.println("executed"); 
    } 
}; 
scheduler.scheduleAtFixedRate(command, 0, 1, TimeUnit.SECONDS); 
scheduler.scheduleAtFixedRate(command, 0, 1, TimeUnit.SECONDS); 
+0

我已經實現了runnable接口,這是我想要並行調度的命令時尚。上面的實現只調度了同一個命令,只有一個實例。而不是一個命令被安排,我希望它被安排在平行的方式,例如,它應該在第1秒運行5次,在第2秒運行5次,在第3秒運行5次,而不是在第1秒運行,在第2秒運行。 – u07103 2012-07-08 14:11:03

+0

您可以使用我現在添加的方法 – 2012-07-08 14:17:32

+0

您建議的方法正是我在做!只是想驗證這是否正確。 – u07103 2012-07-08 14:21:16