この簡単な実験によって、このような作品が制作されました。それは確かにそれを行う一つの方法を示すべきである。
私は、Runnables
をexecute
メソッド経由でサービスに配信する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();
}
作品のこの種のは、それは私が予想よりもはるかに多くを印刷しますが、それはデモ私見として問題ではないので。
BlockingQueueを使用してExecutorServiceにタスクを追加しようとしましたか?これらを使用すると、スペースが再び存在するまで、タスク生成スレッドをロックすることができます。 – daniu
@daniu BlockingQueueはExecutorServiceにどのように送信されますか?それとも、タスクを読み取るために提出されたランナブルによって使用されていますか? – screenmutt
提出されたランナブルによって使用されます。 – user3765370