マルチスレッド、スレッド通信、スレッドプール、Lambda式の概要
14829 ワード
1.マルチスレッド
1.1スレッド状態WAITING(無限待ち)
あるスレッドがwait()メソッドを実行する場合、別のスレッドが起動動作を待つ必要がある.次の3つの方法はすべてObjectクラス内の方法です:public void wait();どのスレッドで実行するかは、現在のスレッドを無限の待機状態にします.所在のスレッドは無限待機状態に入る2.「ロック対象」public void notify()をオンにする.現在のロックオブジェクトに関連する無限待機スレッドの1つを起動し、ランダムに選択します. 無限待機状態スレッドを起動する2.「ロックオブジェクト」public void notifyAll()をオンにする.現在のロックオブジェクトに関連するすべての無限待機スレッド を起動すべてのスレッドを起動する2.「ロック対象」 をオンにする
2.スレッド通信
2.1生活化例
予約-->消費者商品を買い占める生産者消費者1.商品を買う2.待つが、待つ前に、生産者に早く生産する生産者に知らせる必要がある:1.商品を生産する2.休む、休む前に、消費者に早く買いに来てください商品:2つの独立したスレッドの間の共有資源です.
2.2共有リソース処理の問題
現在、生産者と消費者にはまったく関係のない2つのスレッドが存在していますが、商品は両者の間の共有資源として機能します.生産者と消費者の両方にメンバー変数のある商品タイプ【ソリューション】生産者または消費者スレッドオブジェクトを作成する場合、同じ商品クラスオブジェクトを使用して、構築方法パラメータとして初期化操作を行います
3.スレッドプール
3.1スレッドプール
Threadを継承してもRunnableインタフェースに従うにしても、Runメソッドを書き換える必要があり、スレッドオブジェクトごとに1回しか実行できず、その後破棄されます.Runnableインタフェースを使用して実行ターゲットを提供し、Threadを使用してスレッドを実行します.レストランの従業員レストランでは、テーブルの割合で従業員の人数を手配します.各従業員はスレッドオブジェクトと見なすことができ、サーバに何をするかを知らせる必要があります.スレッドオブジェクトの実行目標が何であるかを知らせるよりも、レストランに来る前に従業員がここにいて、あなたが行った後も、従業員はこのようにしています.スレッドプール=>>複数のスレッドを格納できるコンテナプログラムは、スレッドプールからスレッドを取得してターゲットコードを完了し、スレッドをスレッドプールに返すこともできます.スレッドの作成とスレッドの破棄という非常に煩雑な操作を省くことができます.
3.2スレッドプール使用
public static ExecutorService newFixedThreadPool(int nThreads); 初期化パラメータが要求される現在のスレッドプールのスレッド数であるスレッドオブジェクトが得られます.
public Future submit(Runnable target); スレッドプールからスレッドオブジェクトを取得し、指定されたRunnableインタフェース実装クラスオブジェクトを実行ターゲットとして実行します.
3.3匿名の内部クラスからLambda式を導入
4.Lambda式
4.1思想「重点を言う」
service.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName ()); } });/* スレッドプールとしてターゲットコードを実行する匿名の内部クラス方式この方法に必要なパラメータはRunnableインタフェースの実装クラスオブジェクト である. Runnableインタフェースのターゲットはrunメソッドを提供するためであり、What will be run What will be run??? where??? runメソッドの内容ここではRunnableがRunメソッドを提供する必要があり、Runメソッドメソッドを提供するメソッドボディ「ポイントを言う」にはRunメソッドメソッドボディ*/ が必要である.
4.2 Lambda式フォーマット
Lambda式()パラメータリスト->何をするか、メソッド体矢印に対応するコードが通常文(パラメータリスト)->コード文
4.3 Lambda式使用、パラメータなし戻り値なし
4.4 Lambda式使用、パラメータあり戻り値あり
4.5 Lambda式使用前提には、public abstractメソッドのデフォルト属性が1つしかないインタフェース、例えばComparatorインタフェース、Runnableインタフェース があります. lambda式を使用するのは、前後に制約を要求する方法のパラメータがインタフェースタイプであるか、局所変数が呼び出し方法を使用するか、lambdaを使用してもOK である.には、「関数インタフェース」 と呼ばれる抽象的な方法しかないインタフェースがある.
1.1スレッド状態WAITING(無限待ち)
あるスレッドがwait()メソッドを実行する場合、別のスレッドが起動動作を待つ必要がある.次の3つの方法はすべてObjectクラス内の方法です:public void wait();どのスレッドで実行するかは、現在のスレッドを無限の待機状態にします.
2.スレッド通信
2.1生活化例
予約-->消費者商品を買い占める生産者消費者1.商品を買う2.待つが、待つ前に、生産者に早く生産する生産者に知らせる必要がある:1.商品を生産する2.休む、休む前に、消費者に早く買いに来てください商品:2つの独立したスレッドの間の共有資源です.
2.2共有リソース処理の問題
現在、生産者と消費者にはまったく関係のない2つのスレッドが存在していますが、商品は両者の間の共有資源として機能します.生産者と消費者の両方にメンバー変数のある商品タイプ【ソリューション】生産者または消費者スレッドオブジェクトを作成する場合、同じ商品クラスオブジェクトを使用して、構築方法パラメータとして初期化操作を行います
3.スレッドプール
3.1スレッドプール
Threadを継承してもRunnableインタフェースに従うにしても、Runメソッドを書き換える必要があり、スレッドオブジェクトごとに1回しか実行できず、その後破棄されます.Runnableインタフェースを使用して実行ターゲットを提供し、Threadを使用してスレッドを実行します.レストランの従業員レストランでは、テーブルの割合で従業員の人数を手配します.各従業員はスレッドオブジェクトと見なすことができ、サーバに何をするかを知らせる必要があります.スレッドオブジェクトの実行目標が何であるかを知らせるよりも、レストランに来る前に従業員がここにいて、あなたが行った後も、従業員はこのようにしています.スレッドプール=>>複数のスレッドを格納できるコンテナプログラムは、スレッドプールからスレッドを取得してターゲットコードを完了し、スレッドをスレッドプールに返すこともできます.スレッドの作成とスレッドの破棄という非常に煩雑な操作を省くことができます.
3.2スレッドプール使用
public static ExecutorService newFixedThreadPool(int nThreads); 初期化パラメータが要求される現在のスレッドプールのスレッド数であるスレッドオブジェクトが得られます.
public Future submit(Runnable target); スレッドプールからスレッドオブジェクトを取得し、指定されたRunnableインタフェース実装クラスオブジェクトを実行ターゲットとして実行します.
3.3匿名の内部クラスからLambda式を導入
4.Lambda式
4.1思想「重点を言う」
service.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName ()); } });/* スレッドプールとしてターゲットコードを実行する匿名の内部クラス方式
4.2 Lambda式フォーマット
Lambda式()パラメータリスト->何をするか、メソッド体矢印に対応するコードが通常文(パラメータリスト)->コード文
4.3 Lambda式使用、パラメータなし戻り値なし
package com.qfedu.c_lambda;
/* * */
interface Cook {
void cooking();
}
public class Demo1 {
public static void main(String[] args) {
invokeCook(new Cook() {
@Override
public void cooking() {
System.out.println(" ,
, , ");
}
});
invokeCook(() -> {
System.out.println(" , ");
});
invokeCook(() -> System.out.println(" ")); }
public static void invokeCook(Cook cook) {
cook.cooking();
}
}
4.4 Lambda式使用、パラメータあり戻り値あり
package com.qfedu.c_lambda;
import java.util.Arrays; import java.util.Comparator;
public class Demo2 {
public static void main(String[] args) {
Person[] persons = {
new Person(" ", 16),
new Person(" ", 50),
new Person(" ", 40),
new Person(" ", 35),
new Person(" ", 14),
new Person(" ", 18),
};
// public static void sort(T[] a, Comparator super T> c) Arrays.sort(persons, new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
/*
* 1.
* 2.
* *
* * (Person o1, Person o2) -> {
*
* * return o1.getAge() - o2.getAge();
* * }
* * Lambda
*/
Arrays.sort(persons, (Person o1, Person o2) -> {
return o2.getAge() - o1.getAge(); });
/*
* 1.
* 2. ,{} return
*/
Arrays.sort(persons, (o1, o2) -> o2.getAge() - o1.getAge());
for (Person person : persons) {
System.out.println(person);
}
}
}
4.5 Lambda式使用前提