隙間時間にみる早見表〜OracleJavaSE11 gold | クラス・並列処理・Optional 〜

# この記事について
OracleJavaSE11 goldを勉強していた時になかなか覚えられないな〜っとなっていた内容を毎回見ることができるようにこちらの書籍で勉強していた時のまとめたものです！

おすすめ書籍（勉強開始時点の書籍最新版を購入しましょう）

https://book.impress.co.jp/books/1121101020

各カテゴリごとでまとめていますので隙間時間に見てみてください。

## ネストクラス
### インナークラス
クラス直下に記述
public、protected、private、abstract、final
エンクロージングクラスのインスタンスも必要、staticなフィールド等は記述不可能
### staticインナークラス
クラス直下に記述
public、protected、private、abstract、final、static
エンクロージングクラスのインスタンスと記述を必要としない
### ローカルクラス
メソッド内クラス
abstract、final
実質的finalなローカル変数は先に記述されていれば使える
### 匿名クラス
メソッド内クラス
修飾子なし
インタフェースやスーパークラスのインスタンス生成時に｛｝を使用し具体的なオーバーライド処理を記述する。

## 並行処理と並列処理
### 並行処理
シングルコアでジョブを切り替えながら同時並行で処理すること
### 並列処理
マルチコアでジョブを処理すること
### スレッド
スタック領域にメソッドが出入りすること、流れのこと
### マルチスレッド
スレッドを管理する複数のスタック領域が並行処理すること

## Threadクラス
### start()
スレッドを生成して、run()を呼ぶ
### run()
スレッド生成はしない
#### runメソッドオーバーライド
Threadクラスを継承したサブクラスでrun()をオーバーライド または Runnableをラムダ式でオーバライドした匿名クラスをThreadクラスのコンストラクタに渡す

## Runnableクラス
startメソッドはない
### run()の使い方
Thread T = new Thread(new Runnable()｛public void run()｛処理｝｝))
または
Thread T = new Thread(() ->｛処理｝))

## executフレームワーク
スレッドプールを実現するインタフェースとクラス郡

## Executorsクラス
インタフェースごとに説明
### ExecutorService
|  | 説明 |
|:-:|:-:|
| newSingleThreadExecutor() | 新しいスレッドを作成しプールする  |
| newFixedThreadPool(T)  |  引数Tにスレッド数を渡す、数値分だけプールする、固定数 |
|  newCathedThreadPool() | 新しくスレッドを作成し、60秒間、プール内でスレッドを維持し使われなければ廃棄する  |

### ScheduleExecutorService
|  | 説明 |
|:-:|:-:|
|  newSingleThreadScheduleExecutor() |  新しいスレッドを作成しプールする |
| newScheduleThreadPool(T) |  引数Tにスレッド数を渡す、数値分だけプールする、固定数 |


## 実行メソッド
### ExecutorService
#### submit()
スレッドにタスクを与える。引数にラムダ式でRunnableを関数型インタフェースとして渡すことで可能

### ScheduleExecutorService
初動遅延しタスクを定期的に実行する
### schedule(T,U,V)
遅延実行
T RunnableまたはCallableの実行したい処理
U long型の遅延させる時間
V 遅延させる時間の単位(TimeUnitという列挙型)

#### scheduleAtFixRate(T,U,V,W)
実行処理と並行のインターバル付き遅延実行
T RunnableまたはCallableの実行したい処理
U long型の遅延させる時間
V インターバル時間
W 遅延させる時間の単位(TimeUnitという列挙型)

#### scheduleWithFixedDelay(T,U,V,W)
処理が終わり次第、インターバル時間待機、遅延実行
T RunnableまたはCallableの実行したい処理
U long型の遅延させる時間
V インターバル時間
W 遅延させる時間の単位(TimeUnitという列挙型)

### Future
スレッドの結果を返した時の型
#### get()
処理結果を受けとる、リターンがないまたは正常終了した場合はnullになる

## #Callableインタフェース
処理結果を戻したり例外をスローする(Futureインタフェースのget()は処理を返せるが、Runnableでは処理結果を戻せない)
submit()に渡して実行
例外発生した場合、ExecutionException()

## ExecutorService処理例
```java
ExecutorService exec = Executors.newSingleThreadExecutor();
Future<boolean> A = exec.submit(() -> { return boolean処理 });
Boolean result = A.get();
```

## CyclicBarrier
複数のスレッドが特定のポイントで待機できるようにする同期化支援機構
バリアー-待機ポイント
バリアーアクション-実行処理
### 処理例
```java
CyclicBarrier barrier = new CyclicBarrier(3, ラムダ式(new BarrierAction()))
```
3つのスレッドを同期させ、ラムダ式(new BarrierAction())を実行する
await()で処理が終了したことをバリアーに通知する

## 排他制御
synchronizedキーワードをメソッド宣言かメソッド内部の処理で使用

### atomicパッケージ
原子性(一連の動作)を保証する
#### AtomicBoolean
Atomic変数として、Boolean型を扱うクラス、他のボクシングされたプリミディブも可能
#### addAndGet
読みだしから値の変更までの原子性を保証

## CopyOnWithArrayList
読みだしの際にコピーして原子性を保証

## lockパッケージ
### ReentrantLockクラス
ロック制御クラス
|  | 説明 |
|:-:|:-:|
| lock()  | クラスをロックし、unlockメソッドが呼ばれるまで他のスレッドのlockを待機  |
| unlock()  | lock解除  |

## Optionalクラス
メソッドの処理結果を正常、異常に関わらず扱うためのクラス

|  | 説明|
|:-:|:-:|
|  empty() | 空のOptionalインスタンスを生成する  |
| of()  |  要素を持ったOptionalインスタンスを生成する |
| ofNullable()  | 要素を持ったOptionalインスタンスを生成する、例外が発生した時は空のOptionalインスタンスを生成する  |
| isEmpty()  |  空のOptionalならtrue |
| isPresent()  | 値を持ったOptionalならtrue  |
|  get() |  値が入っていることを前提に、値を取り出す |
|  orElse() |  値を持ったOptionalならその値を、空のOptionalなら引数に指定した文字列を返す |
| orElseGet()  |  Supplier型のラムダ式を引数とし、空のOptionalならラムダ式を実行する |
|  orElseThrow() |  Supplier型のラムダ式を引数とし、任意の例外処理を発生させる |
| ifPresent()  | Consumer型のラムダ式を引数とし、値を持ったOptionalなら、ラムダ式の引数に渡して処理を実行する  |
|  ifPresentOrElse() |  値を持っている時は第一引数のConsumer型のラムダ式。空のOptionalの時は第二引数のRunnable型のラムダ式を追加したもの |
| map()  |  function型の引数を受け取り処理結果を受け取った新しいOptionalを生成する |
|  flatmap() |  新しいOptionalは生成せず、処理内のOptionalを返す |