020_JUC
3339 ワード
JUC Java.util.Concurrent並発注
プールのトップレベルインタフェースExecutor
サブインタフェースExecutorService
ツールクラスExecutors(Collections、Arrays...すべてツールクラス)
①newFixedThreadPool(規定数量);固定
②newCashedThreadPool;どうてきぞうか
③newSingleThreadPool;一つだけ
スレッドプールのスレッドは、事前に作成され、作成時間を節約します.
スレッドプール内のスレッドは再利用可能です.
スレッドとタスクがデカップリングされた.
スレッドはタスクを完了するたびに、プールに戻り、スレッドプールがタスクを割り当てるのを待つ.
スレッドの作成方法:
方式一:Threadの継承
方式二:Runnableインタフェースを実現する
方式3:Callableインタフェースを実現する
RunnableとCallableの違いを比較
Runnable
Callable
抽象的な方法はrunです
抽象的な方法はcallです
runメソッドは値を返さない
コールメソッドには戻り値があります(指定できます)
runメソッドに異常は宣言されていません
コールメソッドが例外を宣言しました
Callableオブジェクトがスレッドプールオブジェクトのsubmitである場合に実行
具体的にCallableを使用する場合、受信戻り値はfutureオブジェクト
戻り値取得時は、Futureオブジェクトのget()メソッド取得
パラレル
同時
複数のスレッドが同じ時刻に同時に実行
複数のスレッドが同じ間隔で「同時実行」
スレッドの作成方法:
implements Runnable{run(){...}}を書き換えるnewそしてnew Thread(new名前)t.start()匿名内部クラスnew Thread(new Runnable//これは「」run(){...}}}).start();//ここにいるよ
Callableインタフェースを実現するimplements Callable<>{call(){}public Object call(){...return null}}起動:ExecutorService pool=Executors.newFixedThreadPool(3);//固定スレッド数new上のオブジェクト//スレッドプールオブジェクトを介して、タスクをスレッドオブジェクトに割り当てるpoolを実行する.submit(newオブジェクト);//匿名の内部クラスpool.submit(new Callable(){call(){}public Object call(){...return null});
//JDK 8以降lambda式でマルチスレッドを作成//インタフェースに対してnew Thread(()->直接コードブロックを書く)は抽象的な方法が1つしかない.start();//括弧()をコピーして右矢印を書き込みます->着地括弧{}
プールのトップレベルインタフェースExecutor
サブインタフェースExecutorService
ツールクラスExecutors(Collections、Arrays...すべてツールクラス)
①newFixedThreadPool(規定数量);固定
②newCashedThreadPool;どうてきぞうか
③newSingleThreadPool;一つだけ
スレッドプールのスレッドは、事前に作成され、作成時間を節約します.
スレッドプール内のスレッドは再利用可能です.
スレッドとタスクがデカップリングされた.
スレッドはタスクを完了するたびに、プールに戻り、スレッドプールがタスクを割り当てるのを待つ.
スレッドの作成方法:
方式一:Threadの継承
方式二:Runnableインタフェースを実現する
方式3:Callableインタフェースを実現する
RunnableとCallableの違いを比較
Runnable
Callable
抽象的な方法はrunです
抽象的な方法はcallです
runメソッドは値を返さない
コールメソッドには戻り値があります(指定できます)
runメソッドに異常は宣言されていません
コールメソッドが例外を宣言しました
Callableオブジェクトがスレッドプールオブジェクトのsubmitである場合に実行
具体的にCallableを使用する場合、受信戻り値はfutureオブジェクト
戻り値取得時は、Futureオブジェクトのget()メソッド取得
パラレル
同時
複数のスレッドが同じ時刻に同時に実行
複数のスレッドが同じ間隔で「同時実行」
Lock
ReentrantLock ( , );
:
Lock lock = new ReentrantLock();
//
lock.lock();
//
try{}
finally{
lock.unlock();
}
-------------------- --------------------------
synchronized( )
.wait()
.notifyAll()
*******************
lock *
*
await() *
*
signal() *
// ! *
スレッドの作成方法:
:
extends Thread{
run(){....}
}
// Thread.currentThread().getname()
:
main new .start();
new Thread(" "){
run(){...}
}.start();
-------------------- --------------------------
:
implements Runnable{run(){...}}を書き換えるnewそしてnew Thread(new名前)t.start()匿名内部クラスnew Thread(new Runnable//これは「」run(){...}}}).start();//ここにいるよ
-------------------- --------------------------
:
Callableインタフェースを実現するimplements Callable<>{call(){}public Object call(){...return null}}起動:ExecutorService pool=Executors.newFixedThreadPool(3);//固定スレッド数new上のオブジェクト//スレッドプールオブジェクトを介して、タスクをスレッドオブジェクトに割り当てるpoolを実行する.submit(newオブジェクト);//匿名の内部クラスpool.submit(new Callable(){call(){}public Object call(){...return null});
-------------------- --------------------------
:
//JDK 8以降lambda式でマルチスレッドを作成//インタフェースに対してnew Thread(()->直接コードブロックを書く)は抽象的な方法が1つしかない.start();//括弧()をコピーして右矢印を書き込みます->着地括弧{}