1.1 Javaのマルチスレッドの原則

### 24.01_マルチスレッド(マルチスレッド導入)(理解)
* 1スレッドが何
*スレッドは、プログラムの実行のパスで、プロセスは複数のスレッドを含むことができる
*、複数のスレッドの同時実行は、プログラムの効率を向上させることができ、いくつかの割り当てに作業を完了するためには、
* 2.マルチスレッドのアプリケーションシナリオ
*クモは、同時に複数のコンピュータ画面に共有
*一緒にダウンロードするサンダーオープン複数のスレッドが
* QQより同時に、ビデオと一人よりも、
複数のクライアントが要求した*サーバが処理するために

#を## 24.02_マルチスレッド(マルチスレッド並列と並行差)(理解)
タスクであるが、タスクBが実行され、*二つの平行なタスクが同時に実行されます。(マルチコアのCPUが必要)
*リクエストを実行するために、2つの同時タスクを参照し、プロセッサはほんの短い時間間隔に起因する取り決めを、交互に、これら二つのタスクを入れて、作業の対象とすることができ、人々はで両方のタスクを感じます実行します。
*例えば、私は並列と呼ばれる他のコンピュータBと右側チャットしながら、左動作Aと二人の友人、コンピュータチャットとチャット。
*あなたが私にメッセージA、Bを与えるためにコンピュータを使用して、すぐにメッセージを与え、その後のトーク、トークトーク酢酸に話す場合。これは、並行処理と呼ばれています。

### 24.03_マルチスレッド(Javaランタイムの原則や手続きJVMの起動があなたをマルチスレッド化された)(理解)
Javaプログラムが動作します。* A
アプリケーションを起動するに等しい* JavaコマンドJava仮想マシンを起動するには、JVMを起動し、 、プロセスの開始です。このプロセスは、自動的に「メインスレッド」を起動し、その後、メインスレッドは、クラスのmainメソッドを呼び出すこと。

* B:JVMの起動を使用すると、マルチスレッドされた
* JVMのガベージコレクションが開始さは、少なくともスレッドとメインスレッドを開始し、マルチスレッドです。

### 24.04_マルチスレッディング(ウェイマルチスレッドプログラムの実施1)(マスター)
スレッド* 1.継承
*定義されたクラスがスレッドを継承
* runメソッドをオーバーライドする
runメソッドで実行する新しいスレッドを書くこと*
*スレッドを作成します。オブジェクト
*内部メソッドを実行し、自動的に実行、新しいスレッドを開きます
*

{クラスDemo2_Threadパブリック

/ ** 
 * @param argsを
 * / 
  パブリック静的無効メイン(文字列[] args)
  { 
      MyThread MyThread新しい新しいMT =(); // 4、カスタムクラスのオブジェクトを作成する。
      mt.startを(); //図5に示すように、オープンスレッド

      のために(; I 3000 <I ++はI = 0 INT)
      { 
          するSystem.out.println( "BB"); 
      } 
  } 

} 
クラスはMyThreadスレッドを拡張 {// 1は、クラスの定義は、スレッド継承 公共ボイドRUNを() {// 2、runメソッドオーバーライド のための(INT I = 0;私は<3000; I ++) {// 3、コードを実行する、実行中の書き込み処理。 のSystem.out.println( "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"); } } }

  

  

 

### 24.05_マルチスレッディング(ウェイマルチスレッドプログラムの実施2)(マスター)
* 2。Runnableを実装
*定義しているクラスは、Runnableインタフェースを実装する
runメソッドを実装*
runメソッドで実行する新しいスレッドを書くこと*
*は、自己の作成しますRunnableをサブクラスは、オブジェクト定義
のRunnableを渡し、スレッド・オブジェクトを作成します*
内部自動的に実行Runnableを()メソッドを呼び出します、新しいスレッドを開くために呼び出す)(*スタート

{クラスDemo3_Runnableパブリック
    / ** 
     * @param argsをする
     * / 
    パブリック静的無効メイン(文字列[] args){ 
        氏のMyRunnable新しい新MyRunnable =(); // 4、カスタムクラスのオブジェクトを作成する。
        // Runnableをターゲット=新しいMyRunnableを() 、
        (MRの)T =新しい新しいスレッドをスレッド; // 5、コンストラクタスレッドにパラメータとして渡されている。
        t.start(); // 6は、開いたスレッド

        のためには、(; iはi = 0 int型 3000 <; iは++します) { 
            のSystem.out.println( "BB"); 
        } 
    } 
} 

。器具のRunnable {// 1、Runnableインタフェースを実装するカスタムクラスMyRunnableクラス
    @Override 
    公共ボイドラン(){// 2は、runメソッドをオーバーライドする
        ための式(I int型= 0; iは3000 <; iは ++){// 3、 ラン内のコードを実行する、書き込み処理 
            のSystem.outを。 println( "aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
        } 
    } 

}

  

### 24.06_マルチスレッド(Runnableをの原則の実現)(理解)
*表示のソースコード
* 1、、Runnableインタフェースの参照を渡し、Threadクラスのコンストラクタを参照してください
メンバ変数を通過するのinitターゲットを見つけるために* 2()メソッドターゲットの割り当て
対象がnullでない場合、runメソッドを表示するには、* 3は、実行発見方法は、判断する必要がrunメソッドのRunnableインタフェースオブジェクトのサブクラスを呼び出します

### 24.07_マルチスレッディング(二つのアプローチの違い)(マスター)
*表示のソースコードの違い:
*連続子クラスとして:.スレッドは、開始()を呼び出すときに、ダイレクト)(実行Threadクラスを上書きします()メソッドを実行するサブクラスを見つける
内部基準法のRunnableが空であるときを決定する* B、変数のメンバーがそれを覚えて、コンストラクタがRunnableを参照を渡すかどうかを:. Runnableを実装開始()(実行するために呼び出す)メンバ変数()Runnableのrunをコンパイルし、実行時の実装が実行された空でないときサブクラス()メソッドを参照してください

*スレッドの継承された
*ボーナスを:あなたは、直接、簡単なコードでThreadクラスを使用することができます
*欠点:場合親クラスを持って、すでに、この方法を使用することはできません
* Runnableを実装
しても、親クラスがインタフェースを実装することができるので、親クラスの独自の定義は、問題ではない、とのインタフェースが実現可能以上であったスレッドクラス:*ボーナスを
*欠点がある:スレッドを取得するには、直接法は、スレッドオブジェクトを取得する必要性を通す方法を使用することはできません、コードの複雑さ
### 24.08_マルチスレッディング(匿名内部クラスがスレッドを達成するための2つの方法があり)(マスター)
*継承Threadクラス

スレッド新しい新しい()
        {// 1、新しい新しいクラス(){クラスが継承} 
            公共ボイドランを()
             {// 2、runメソッドオーバーライド
                のための(INT I = 0、I 3000 <; Iは++)
                 {// 3、実行されるコードは、実行中の書き込み処理
                     のSystem.out.println( "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"); 
                    } 
             } 
        } .start(); 
        * Runnableを実装する

新しい新しいスレッド(新しい新しいRunnableを
        (){{// 1、新たな新しいインターフェイスを() }このインタフェースを実装
            )(公共ボイドランを
            実行方法オーバーライド、// 2 { 
              ために(INT I = 0;私は<3000; I ++) 
              } 
              {// 3、コードが実行される、実行中の書き込みプロセス。
              System.out.println( "BB"); 
            } 
        。}))(開始。

  

### 24.09_マルチスレッディング(名前と設定名を取得)(マスター)
* 1名を取得
のgetName()メソッドでスレッドオブジェクトの名前を取得する*
* 2セット名
文字列型は、コンストラクタの名前を通過することができます*
*
スレッド新しい新規( "XXX"){
公共ボイドRUN(){
ための(I = 0 int型、私は1000 <; Iは++){
System.out.printlnは(this.getName()+ ".... aaaaaaaaaaaaaaaaaaaaaaa");
}
}
} .start();

新しい新しいスレッド( "YYY"){
公共ボイドRUN(){
用(INT I = 0、I 1000 <; Iは++){
System.out.printlnは(this.getName()+」.. ..bb「);
}
}
;} .start()
*スレッドオブジェクト名のsetName(String)メソッドによって提供されてもよい
*
スレッド= T1新しい新しいスレッド(){
公共ボイドRUN(){
(I 0 = int型のために、私は<1000; iは++){
System.out.println(this.getName()+ ".... aaaaaaaaaaaaaaaaaaaaaaa")。
}
}
}。

スレッドT2 =新しいスレッド(){
ます。public void実行(){
{のために(I ++;;私は<1000年I = 0 int型)
( ".... BB" this.getName()+)のSystem.out.println。
}
}
}。
t1.setName( "芙蓉姐姐")。
t2.setName( "凤姐");

t1.start();
t2.start();

### 24.10_マルチスレッディング(オブジェクト現在のスレッドを取得する)(対照)
*にThread.currentThread()、メインスレッドを取得することができる
*
新しい新しいスレッド(新しい新しいRunnableを(){
公共ボイドRUNを(){
(INT I = 0 ;私は1000年<;私は++){
System.out.printlnは(にThread.currentThread()のgetName()+ "aaaaaaaaaaaaaaaaaaaaa ...");.
}
}
})スタート();

新しい新しいスレッド(新しい新しいRunnableを(){
公共RUNボイド(){
ため(;私は1000 <; I = 0 int型Iが++){
System.out.printlnは(にThread.currentThread()のgetName()+ "BB ...");
}
}
})を起動(。 );
にThread.currentThread()のsetName( "私はメインスレッドだ"); // main関数スレッドへの参照を取得し、彼の名前に変更
するSystem.out.println(にThread.currentThread()のgetName()を );. // 取得します。主な機能のスレッドの参照、との名前を取得
### 24.11_マルチスレッディング(スリープ中のスレッド)(マスター)
*のThread.sleepを(MS、NS)、制御電流スレッドスリープ数ミリ秒、1秒、1秒= 1000ミリ秒= 1000×1000×1000ナノ秒1000000000

スレッド新新(){
公共空RUN(){
(int型I = 0;私は<10; I ++)のために{
System.out.printlnは(のgetName()+ "aaaaaaaaaaaaaaaaaaaaaa ...");
試み{
のThread.sleep(10 );
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}
}
} .start();

新しい新しいスレッド(){
公共ボイドRUN(){
(I = 0をint型のために、私は10 <; Iは++){
システム.out.println(のgetName()+ "BB ...");
試み{
のThread.sleep(10);
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}
}
} .start();
## #24.12_マルチスレッド(デーモン・スレッド)(マスタ)
*は、setdaemon()は、デーモンスレッドとスレッドの設定、スレッドだけで実行されない、他の非デーモンスレッドがオーバー実行され、自動的に終了し
*
スレッドT1 =新しいスレッド(){
ます。public void実行(){
のために(int型私= 0;私は<50; I ++){
System.out.printlnは(のgetName()+ "... aaaaaaaaaaaaaaaaaaaaaa");
{試みる
のThread.sleep(10)。
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}
}
}
}。

スレッドT2 =新しいスレッド(){
ます。public void実行(){
のために(int型私= 0;私は<5; I ++){
System.out.printlnは(のgetName()+ "... BB");
{試みる
のThread.sleep(10)。
}キャッチ(InterruptedExceptionある電子){
e.printStackTrace();
}
}
}
}。

t1.setDaemon(真の); //将T1设置为守护线程

t1.start()。
t2.start();
### 24.13_マルチスレッド(スレッドが参加)(マスター)
*参加は()、現在のスレッドが指定されたスレッドの実行、継続するために、現在のスレッドが終了するまで中断される
*(INT)に参加した後、指定したミリ秒を待つために続けることができます
*
決勝T1は、スレッド新しい新しいスレッドを=(){
公共空RUN(){
のために(int型I = 0;私は50 <;私は++){
System.out.printlnは(のgetName()+ "aaaaaaaaaaaaaaaaaaaaaa ...");
試み{
スレッド。 SLEEP(10);
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}
}
};

スレッドT2 =新しい新しいスレッド(){
公共ボイドRUN(){
ため(;私は50 <; I = 0 int型Iが++) {
IF(I == 2){
試み{
//t1.join(); //割り込みを加え
t1.join(30); //を加え、そこに固定された時間であり、一定時間後、代替の実行を継続
スレッド。 SLEEP(10);
}キャッチ(InterruptedExceptionあるE){

e.printStackTrace();
}
}
のSystem.out.println(のgetName()+ "BB ...");

}
}
};

t1.start();
t2.start();
### 24.14_マルチスレッディング(礼譲スレッド)(理解)
*収率は、CPUを放棄します

### 24.15_マルチスレッド(スレッド優先セット)(理解)
* setPriorityを()を設定するためのスレッドの優先順位

### 24.16_マルチスレッディング(同期コード・ブロック)(マスタ)
同期する必要がどのような状況下では* 1
マルチスレッドは、同時に実行されるコードの複数の部分は、我々は別のものに切り替えていないCPUで実行されるコードの一部を処理したい場合*そして、あなたが同期する必要があります。スレッドの仕事。
* 2つのコードが同期している場合は、同じ期間にのみコードの一部で実行することができるが終了する前に実行されていない、コードの別の部分を実行しません。
* 2同期ブロック
*の使用は、同期キーワードプラス同期コードブロックと呼ばれるコードの部分を定義するために、ロックオブジェクト、
同じロックオブジェクト場合、ブロックを同期*倍、それらが同期されています

{プリンタクラス
デモデモ新しい新D =();
パブリック静的ボイドPRINT1(){
同期(D){//ロックされたオブジェクトは、任意のオブジェクトであるが、同じロックが匿名オブジェクトことができないことを保証するためにコードをロックすることができる
システム。 out.print( "黒");
System.out.print( "MA");
System.out.print( "プロセス");
System.out.print( "注文");
System.out.print(「会員");
System.out.printの(" \のR&LT \ N- ");
}
}

パブリック静的ボイドPRINT2(){
同期(D){
System.out.print(の"パス");
System.out.printの("カイ");
System.out.print(の" ";)放送
System.out.printの("オフ");
System.out.printの(" \のR&LT \ N- ");
}
}
}
### 24。17_マルチスレッディング(同期方法)(マスタ)
コードの全てで同期キーワードの方法の変形を用い*が同期しています

{プリンターのクラスには、
公共の静的な無効PRINT1(){
同期(Printer.class){//ロックされたオブジェクトは、任意のオブジェクトであってもよいが、同じロックが匿名オブジェクトにすることはできませんことを保証するために、コードをロックすることができます
System.out.print(「ブラック");
System.out.print(" MA ");
System.out.print("プロセス");
System.out.print("注文");
System.out.print("メンバー「)
のSystem.out .PRINT( "\のR&LT \ N-");
}
}
/ *
ロック*非静的関数が同期している:この
*静的ロック同期関数である:バイトコードオブジェクト
* /
パブリック静的ボイド同期PRINT2(){
システム。 out.print( "パス");
System.out.print( "知恵");
System.out.print( "放送");
System.out.print( "オフ");
System.out.print(「\ R&LT \ N- ");
}
}

### 24.18_マルチスレッド(スレッド安全性の問題)(マスター)
*複数のスレッドが同時に同じデータで作業、それは安全性の問題を通すことが可能である
*この問題、ソースのオペレーティングデータの同期を解決することができるシンクロナス・テクノロジを使用して、しないでください複数のスレッドは、一緒に動作する

{publicクラスがDemo2_Synchronized

/ **
* @paramの引数
*需要:4つのウィンドウによって販売されている鉄道チケット、100の合計。
* /
パブリック静的な無効メイン(文字列[] args){
TicketsSeller新しい新しいTicketsSeller T1 =();
TicketsSeller T2 =新しい新しいTicketsSeller ();
TicketsSeller新しい新しいTicketsSeller T3 =()
=()TicketsSeller新しい新しいTicketsSeller T4;

t1.setName( "ウィンドウ1。");
t2.setName( "ウィンドウ2");
t3.setName( "ウィンドウ3。");
T4 .setName( "窓4。");
t1.start();
t2.start();
t3.start();
t4.start();
}

}

クラスTicketsSellerスレッド{延び
プライベート静的INTチケット= 100;
静的オブジェクトOBJ =()新規新しいオブジェクト、
パブリックTicketsSeller(){
スーパー();

}
TicketsSellerパブリック(文字列名){
スーパー(名前);
}
公共ボイドRUN(){
(真の)一方{
同期(OBJ){
IF(チケット<= 0)
BREAK;
試み{
のThread.sleep(10); //スレッド1人の睡眠、睡眠スレッド2、スレッド3睡眠、睡眠糸4
}キャッチ(InterruptedExceptionあるE){

e.printStackTrace();
}
のSystem.out.println(のgetName()+ + tickets-- "...これは最初に" + "チケット番号");
}
}
}
}

### 24.19_マルチスレッド(Runnableを実装駅の切符の例を用いて)(マスタ)


+ S1)。同期(S1){

























System.out.println(のgetName()+ "...取得" + S1 + "オープンを食べる");
}
}
}
}
} .start();
}

### 24.21_マルチスレッド(スレッドセーフなクラス前のレビュー)(マスター)
* A:レビューは、スレッドの安全性の問題の前に言った
ソースコードを参照してください*:ベクトル、StringBufferの、ハッシュテーブル、Collections.synchroinzed(XXX)
*ベクタスレッドです安全、ArrayListにはスレッドセーフではない
のStringBufferがスレッドセーフで、StringBuilderのは、スレッドセーフではありません*
Hashtableのは、スレッドセーフである、HashMapのは、スレッドセーフである*
### 24.22_マルチスレッディング(要約)

おすすめ

転載: www.cnblogs.com/sdrbg/p/11260447.html