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()メソッド取得
パラレル
同時
複数のスレッドが同じ時刻に同時に実行
複数のスレッドが同じ間隔で「同時実行」
 
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();//括弧()をコピーして右矢印を書き込みます->着地括弧{}