我有一个问题需要解决。其中我需要在每次请求执行时运行一些可运行对象的列表。
比如说,我有一个如下所示的列表
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秒......
有没有办法解决我的问题请建议我
答案 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
,然后使用指定的等待时间安排下一个可用的。