2017-09-19 10 views
0

すべて、Java ExecutorService Iteratorからのタスクの読み込み

私はJava ExecutorServiceを使用して並列にタスクを実行しています。残念ながら、タスクのリストは現在数千万に達しています。これは、メモリー制約のために、事前に実行者サービスにタスクを実行依頼するのが実行不可能であることを意味します。

私は、必要に応じて動的にタスクを作成するイテレータを生成することができますが、これをExecutorServiceにどのように適用するのが最も適切かはわかりません。

イテレータから次のタスクを引き出すタスクを作成するか、これを行うにはより良い方法がありますか?

+3

BlockingQueueを使用してExecutorServiceにタスクを追加しようとしましたか?これらを使用すると、スペースが再び存在するまで、タスク生成スレッドをロックすることができます。 – daniu

+0

@daniu BlockingQueueはExecutorServiceにどのように送信されますか?それとも、タスクを読み取るために提出されたランナブルによって使用されていますか? – screenmutt

+1

提出されたランナブルによって使用されます。 – user3765370

答えて

1

この簡単な実験によって、このような作品が制作されました。それは確かにそれを行う一つの方法を示すべきである。

私は、Runnablesexecuteメソッド経由でサービスに配信するServiceFeederを作成して実行します。

ExecutorService service = Executors.newFixedThreadPool(10); 

class ServiceFeeder implements Runnable { 
    final Iterator<Runnable> i; 

    public ServiceFeeder(Iterator<Runnable> i) { 
     this.i = i; 
    } 

    @Override 
    public void run() { 
     while (i.hasNext()) { 
      service.execute(i.next()); 
     } 
    } 
} 

public void test() throws Exception { 
    System.out.println("Hello world!"); 
    // Demo Iterator<Runnable> - use yours. 
    Iterator<Runnable> i = new Iterator<Runnable>() { 
     volatile int n = 0; 

     @Override 
     public boolean hasNext() { 
      return n < 100; 
     } 

     @Override 
     public Runnable next() { 
      return() -> System.out.println(n++); 
     } 
    }; 

    ServiceFeeder feeder = new ServiceFeeder(i); 
    Thread feederThread = new Thread(feeder); 
    feederThread.start(); 
    // Wait for the feeder to stop. 
    feederThread.join(); 
    // Wait for the service to stop. 
    service.shutdown(); 
} 

作品のこの種のは、それは私が予想よりもはるかに多くを印刷しますが、それはデモ私見として問題ではないので。

+0

これはExecutorServiceを使用しませんが、その点が分かります。 – screenmutt

+0

@screenmutt - 'service.execute(i.next());は' ExecutorService'を使用していませんか? – OldCurmudgeon

+0

ああ!私は逃しました。ごめんなさい。 :) – screenmutt

関連する問題