A、Javaのマルチスレッドまとめたものの基礎

まず、スレッドとプロセスの違い

1.スレッドは、実際に実行パスで、アプリケーションプロセスは、スタンドアロンアプリケーションです。

2. Aスレッド実行のパスで、複数の実行パスは、プロセスにおいて、同時に実行される、N、複数のスレッドが存在するであろう、すべてのスレッドの組を処理します。

3.マルチスレッド目的は、プログラムの効率を改善することです。

第二に、マルチスレッドアプローチを作成する(次の3つの方法は一例ずつではありません)

1.最初は、runメソッドをオーバーライドし、Threadクラスの継承です。

、Runnableインタフェースを実装する2、runメソッドをオーバーライドします。

3.匿名内部クラスを使用します。

第三に、デーモンスレッド

二つのスレッドで1.javaは、一方が他方のスレッドの保護者であり、ユーザスレッドです。

1.1ユーザ・スレッドが作成したユーザー定義のスレッドを指し、停止までメインスレッドは、ユーザスレッドを停止しません。

1.2。プロセスが存在するか、メインスレッドを停止しないデーモンスレッドは、スレッド・デーモンが停止されます。

2.は、setdaemonデーモンスレッドを設定する(true)メソッド

3.コード例

public class DaemonThread {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    System.out.println("我是子线程...");
                }
            }
        });
        thread.setDaemon(true);
        thread.start();
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(100);
            } catch (Exception e) {

            }
            System.out.println("我是主线程");
        }
        System.out.println("主线程执行完毕!");
    }
}

4.結果

4.1設定スレッドは、setdaemon trueに)、以下の結果:

我是子线程...
我是主线程
我是子线程...
我是主线程
我是子线程...
我是主线程
主线程执行完毕!

4.2が設定されていないスレッドをは、setdaemon trueに以下の結果は、(私は子スレッドでした...()を循環されています)、):

我是子线程...
我是主线程
我是子线程...
我是主线程
我是子线程...
我是主线程
主线程执行完毕!
我是子线程...
我是子线程...
我是子线程...

第四に、マルチスレッド動作状態

1.画像の決意

新しい状態、レディ状態、状態を実行している状態を遮断し、死の状態:常に次の5つのいずれかの状態で最後まで実行作成、から通します。

2.各状態の分析

2.1新しい状態:スレッドが新しいオペレータ、例えば、新しいスレッド(R)を使用して作成された場合、スレッドは、この場合には、新しいスレッドの状態を実行するために開始されていません。スレッドは、新生状態、まだスレッドを実行開始されていないプログラムコードである場合には

2.2準備状態:新しく作成されたスレッドは、スレッドはstart()メソッドを呼び出す必要があり、スレッドを実行するために、自動的に起動しません。あるスレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出すとき、start()メソッドを実行しているシステムリソースのスレッドを作成し、スケジュールのスレッドが()メソッドを実行して実行します。start()メソッドが戻った後、スレッドが準備完了状態にあります。即応の状態は必ずしもすぐに実行()メソッドを実行していない、彼らは唯一のスレッドを実行している得ることができる前に、スレッドはまた、他のスレッドのCPU時間とCPU時間を競争しなければならないスレッド。コンピュータシステム内の単一のCPUが、それは同時に複数のスレッドを実行することは不可能であるため、1時間だけのスレッドが実行されています。したがって、この時点で、レディ状態にある複数のスレッドがあるかもしれません。レディ状態にある複数のスレッドがで決定されたJavaランタイムシステムのスレッドスケジューラ(スレッドスケジューラスケジュール)。

2.3動作状態:それは操作に入った前にスレッドが、CPU時間を取得し、本当に始まっrun()メソッド。

2.4閉塞状態:動作中のスレッドは、様々な理由にブロックされた状態に入ることができる:
        方法睡眠を呼び出すことで、スリープ1>スレッド;
        2>呼び出すスレッドがI / O操作でブロックされている、すなわち、入力操作出力動作は、呼び出し元が完了するまでには戻りません。
        ロックを取得しようとしている3>スレッドが、ロックが別のスレッドによって保持されている;
        4>スレッドがトリガ条件を待っています。

2.5死の状態:2つの理由がありますなぜスレッド死:
       1)RUNメソッドが終了正常と自然死。
       2)キャッチされない例外は、スレッドのrunメソッド突然死を終了します。
生きている現在のスレッド(ある、いずれかのいずれかで実行することができるブロックされる)かどうかを決定するために、のisAliveメソッドを使用します。あなたが実行しているか、ブロックされている場合は、trueを返します。スレッドはまだ新しく、状態を実行していない、またはスレッドの死は、偽が返された場合。

五、join()メソッド

たとえば、1:のメインスレッドt1.join()メソッドは、それが実行を右T1を与えるべきであることをメインスレッドを実行します。

2.コードケース:

public class DaemonThread {
    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (Exception e) {

                    }
                    System.out.println(Thread.currentThread().getName() + "i:" + i);
                }
            }
        });
        t1.start();
        // 当在主线程当中执行到t1.join()方法时,就认为主线程应该把执行权让给t1
        t1.join();
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(10);
            } catch (Exception e) {

            }
            System.out.println("main" + "i:" + i);
        }
    }
}

3.結果

Thread-0i:0
Thread-0i:1
Thread-0i:2
Thread-0i:3
Thread-0i:4
Thread-0i:5
Thread-0i:6
Thread-0i:7
Thread-0i:8
Thread-0i:9
maini:0
maini:1
maini:2
maini:3
maini:4
maini:5
maini:6
maini:7
maini:8
maini:9

4.分析:最初の子スレッドは、サブスレッドの実行が完了した後にメインスレッドを実行し、メインスレッドの譲歩を終了します。

六小さな福祉

1.プロセスとスレッドの違いは?

 A:プロセスは、すべてのスレッドの組であり、各スレッドは、実行プロセスのパスが、スレッドの実行パス。

2.なぜ使用マルチスレッド?

 A:効率を改善するためのプログラム

3. Threadクラスの継承が良いですか実装Runnableの良いインタフェースを?

 A:実装はインターフェースに継承させ続けることができるので、Runnableインタフェースは、良いです。Threadクラスの継承は継承できません。

THE OF結論

1.上映の記事では、マルチスレッドの安全性の問題と解決策を説明します。

2.粘り強いです!ハハッハッハ~~~

 

公開された122元の記事 ウォン称賛64 ビュー50000 +

おすすめ

転載: blog.csdn.net/chenmingxu438521/article/details/103760703