6

解決すべき問題があります。ここでは、実行可能なオブジェクトのリストを実行する必要がありますが、各リクエストの実行には多少の遅延があります。

たとえば、私は以下のようなリストを持っていると言います

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); 

しかし、ここでは引数としてリストを送信できないため、2秒の遅延で7秒間同じリクエストを実行できます...

だから私の問題を解決する方法はありますか私に提案してください

4

3 に答える 3

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 のコーディング例はこちら

于 2013-03-14T09:02:52.560 に答える
0

Runnableのリストのラッパーであり、送信されたものを追跡するRunnableを作成できます。次に、その単一の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();
        }
    }   
}

基本的に、それ自体が実行可能であるコレクションオブジェクト。エグゼキュータルートを使用する場合は、Callableでも同様のことを行うことに注意してください。

于 2013-03-14T12:01:17.767 に答える
0

一つの質問。これらの Runnable は、前の Runnable が完了してから N 秒後に実行する必要がありますか、または前の Runnable がスケジュールされてから 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その後、指定された待機時間で次の利用可能なものをスケジュールします。

于 2013-03-14T12:18:05.337 に答える