Java Gold 例題 並列処理

```java
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPoolTest {
	
	private static final ExecutorService threadPool = Executors./* insert code */
 
	public static void main(String[] args) {
		startServer();
	}

	public static void startServer() {
		for(int i = 0; i < 6; i++) {
			final int requestNumber = i;
			threadPool.submit(() -> {
				handleRequest(requestNumber);
			});
		}
		threadPool.shutdown();
	}
	
	public static void handleRequest(int requestNumber) {
		System.out.println("request number : " + requestNumber);
		System.out.println("thread : " + Thread.currentThread().getName());
		
		try {
			Thread.sleep(1000);
		} catch(InterruptedException e) {
			e.printStackTrace();
		}
	}
}
```
/* insert code */部分に`Executors`のファクトリメソッドを挿入して次の実行結果が得られました。

１回目の実行結果
```
request number : 2
request number : 0
request number : 5
request number : 3
request number : 4
request number : 1
thread : pool-1-thread-3
thread : pool-1-thread-2
thread : pool-1-thread-6
thread : pool-1-thread-5
thread : pool-1-thread-1
thread : pool-1-thread-4
```
１回目の実行後/* insert code */部分を修正して、別の`Executors`のファクトリメソッドを挿入して次の実行結果が得られました。

２回目の実行結果
```
request number : 1
request number : 0
thread : pool-1-thread-2
thread : pool-1-thread-1
request number : 2
request number : 3
thread : pool-1-thread-1
thread : pool-1-thread-2
request number : 4
thread : pool-1-thread-1
request number : 5
thread : pool-1-thread-2
```

/* insert code */にあてはまるコードについて
　・１回目の実行結果にあてはまるファクトリメソッドを１つ選んでください。
　・２回目の実行結果にあてはまるファクトリメソッドを２つ選んでください。


1. newThreadPool();
1. newThreadPool(2);
1. newSingleThreadExecutor();
1. newFixedThreadPool();
1. newFixedThreadPool(2);
1. newCachedThreadPool();
1. newCachedThreadPool(2);
1. newScheduledThreadPool();
1. newScheduledThreadPool(2);
1. scheduleAtFixedRate();
1. scheduleWithFixedDelay();

<details>
<summary>解答</summary>

正解 
1回目: 6
2回目: 5, 9


1,2 
`newThreadPool();`
`newThreadPool(2);`
存在しません。

3 

[`newSingleThreadExecutor()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/Executors.html#newSingleThreadExecutor())
一つのスレッドを生成します。

実行結果は以下になります。
```
request number : 0
thread : pool-1-thread-1
request number : 1
thread : pool-1-thread-1
request number : 2
thread : pool-1-thread-1
request number : 3
thread : pool-1-thread-1
request number : 4
thread : pool-1-thread-1
request number : 5
thread : pool-1-thread-1
```

4
引数なしの`newFixedThreadPool();`は存在しません。


5
2回目の実行結果にたいしてありうるファクトリメソッドです。
・[newFixedThreadPool(int nThreads)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/Executors.html#newFixedThreadPool(int))

最初の2つのタスクが送信されたとき、2つのスレッドがそれぞれ1つずつタスクを処理するため、実行結果が被ります。
その後、次のタスクは空いているスレッドによって処理されます。
スレッドがタスクを処理し終わった時点で、新しいタスクがそのスレッドに割り当てられます。
タスクの実行順序はスレッドの空き具合によって決まります。

6
1回目の実行結果にたいしてありうるファクトリメソッドです。
[`newCachedThreadPool()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/Executors.html#newCachedThreadPool())

7
引数にintを指定する`newCachedThreadPool(int num)`メソッドは存在しません。

ただし、引数に`ThreadFactory`を指定する`newCachedThreadPool(ThreadFactory threadFactory)`メソッドは存在します。

[`newCachedThreadPool​(ThreadFactory threadFactory)`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/Executors.html#newCachedThreadPool(java.util.concurrent.ThreadFactory))
必要に応じ、新規スレッドを作成するスレッド・プールを作成しますが、利用可能な場合には以前に構築されたスレッドを再利用します。

8
引数なしの`newScheduledThreadPool​()`は存在しません。

9
2回目の実行結果にたいしてありうるファクトリメソッドです。
[`newScheduledThreadPool​(int corePoolSize)`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/Executors.html#newScheduledThreadPool(int))

`newFixedThreadPool(2)`は単純なタスクキューとスレッド管理を行いますが、`newScheduledThreadPool(2)`はより複雑なタスクスケジュール管理を行います。

10, 11
`ScheduledExecutorService`インターフェイスのメソッドです。ファクトリメソッドではありません

[`scheduleAtFixedRate()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit))
[`scheduleWithFixedDelay()`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit))

</details>


https://qiita.com/T-ngtj/private/df254aacd05be698199a