タスクExectorService
をプールして送信する方法を学んでいます。threads
以下に簡単なプログラムがあります
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Processor implements Runnable {
private int id;
public Processor(int id) {
this.id = id;
}
public void run() {
System.out.println("Starting: " + id);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("sorry, being interupted, good bye!");
System.out.println("Interrupted " + Thread.currentThread().getName());
e.printStackTrace();
}
System.out.println("Completed: " + id);
}
}
public class ExecutorExample {
public static void main(String[] args) {
Boolean isCompleted = false;
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 0; i < 5; i++) {
executor.execute(new Processor(i));
}
//executor does not accept any more tasks but the submitted tasks continue
executor.shutdown();
System.out.println("All tasks submitted.");
try {
//wait for the exectutor to terminate normally, which will return true
//if timeout happens, returns false, but this does NOT interrupt the threads
isCompleted = executor.awaitTermination(100, TimeUnit.SECONDS);
//this will interrupt thread it manages. catch the interrupted exception in the threads
//If not, threads will run forever and executor will never be able to shutdown.
executor.shutdownNow();
} catch (InterruptedException e) {
}
if (isCompleted) {
System.out.println("All tasks completed.");
} else {
System.out.println("Timeout " + Thread.currentThread().getName());
}
}
}
特別なことは何もしませんが、2 つのタスクを作成threads
し、合計で 5 つのタスクを送信します。それぞれthread
がタスクを完了すると、次のタスクが実行されます。上記のコードでは、 を使用していますexecutor.submit
。にも変更しましたexecutor.execute
。しかし、出力に違いは見られません。submit
とexecute
メソッドの違いは何ですか? これがAPI
言うこと
メソッド submit は、基本メソッド Executor.execute(java.lang.Runnable) を拡張し、実行をキャンセルしたり、完了を待機したりするために使用できる Future を作成して返します。メソッド invokeAny および invokeAll は、タスクのコレクションを実行してから、少なくとも 1 つまたはすべてのタスクが完了するまで待機する、最も一般的に有用な形式の一括実行を実行します。(クラス ExecutorCompletionService を使用して、これらのメソッドのカスタマイズされたバリアントを作成できます。)
しかし、それが正確に何を意味するのか、私には明らかではありませんか?