执行具有时间间隔的可运行列表

时间:2013-03-14 05:14:48

标签: java multithreading

我有一个问题需要解决。其中我需要在每次请求执行时运行一些可运行对象的列表。

比如说,我有一个如下所示的列表

List<MyReqObject> myReqObjects=new ArrayList<MyReqObject>();

我创建了一个带有X个线程的执行器,如下所示

ExecutorService execute=Executors.newFixedThreadPool(X)

现在使用execute.invokeAl(myReqObjects);我试图调用所有这些请求......

但我应该在这些之间有延迟。 实现这个我试过

ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(myObject, 2, 7, SECONDS); 

但是在这里我不能将列表作为参数发送,所以我可以执行相同的请求7秒,延迟2秒......

有没有办法解决我的问题请建议我

3 个答案:

答案 0 :(得分:1)

创建一个计时器:

Timer timer = new Timer();

如果你需要再运行一次:

timer.schedule(new TimerTask() {
   @Override
   public void run() {
   // Your code here
   }
}, 2*1000); 

反复运行:

 timer.scheduleAtFixedRate(new TimerTask() {
   @Override
   public void run() {
   // Your code here
   }
}, 2*1000); 

查看Timer和TimerTask here

的一些编码示例

答案 1 :(得分:0)

您可以创建一个Runnable,它是Runnables列表的包装器,并跟踪发送的内容。然后将该单个Runnable作为调度程序的对象。

public class RunnableList implements Runnable {

    private List<Runnable> runList = Collections.synchronizedList(
                                                  new ArrayList<Runnable>());

    public void addRunnable(Runnable r) {
        runList.add(r);
    }

    @Override
    public void run() {
        if(!runList.isEmpty()) {
            runList.remove(0).run();
        }
    }   
}

本质上是一个集合对象,它本身就是一个Runnable。请注意,如果你去Executor路线,你会用Callable做类似的事情。

答案 2 :(得分:0)

一个问题。这些Runnables是否需要在上一次运行完成后N秒执行,或者在上一次运行之后N秒执行。

如果是后者,您可以不断安排和增加时间计数器。

int timeToWait = 2000;

ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(myObject, 2, 7, SECONDS); 
for(int i = 1; i <= runnables.size(); i++){
   scheduler.schedule(r, timeToWait * i, TimeUnit.MILLISECONDS);
}

前者有点棘手。你需要有可运行的时间表

final int timeToWait = 2000;
class SchedulingRunnable implements Runnable{
   private final Iterator<Runnable> runnables;
   private final ScheduledExecutorService scheduler

   public SchedulingRunnable(Iterator<Runnable> rs, ScheduledExecutorService es){..}

   public void run(){
      runnables.next().run(); //assuming runnables.hasNext()
      if(runnables.hasNext()){
          scheduler.schedule(this, timeToWait, TimeUnit.MILLISECONDS);
      }
   } 
}
ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(1);
scheduler.schedule(new SchedulingRunnable(runnables.iterator(),schedule), timeToWait, TimeUnit.MILLISECONDS); 

此示例有一个包装器Runnable执行下一个可用的run,然后使用指定的等待时间安排下一个可用的。