ホームページ  >  記事  >  Java  >  これは間違いなく Java マルチスレッドの最も詳細な説明です

これは間違いなく Java マルチスレッドの最も詳細な説明です

无忌哥哥
无忌哥哥オリジナル
2018-07-20 11:49:382483ブラウズ

Javaのマルチスレッド

オペレーティングシステムの以前のプロセスとスレッドで、スレッドについて詳しく説明しましたが、Javaでのマルチスレッドの実装については、この記事でさらに詳しく説明します。

スレッド ステータス

Java のスレッド ステータスについては、次の 5 つの状態モデルを使用して表すことができます:

作成、準備完了、実行中、ブロック、終了の 5 つの状態

作成ステータス: JVM はmain() メソッド メインスレッドを作成します。メインスレッドは、スレッドオブジェクトの start() メソッドを呼び出して子スレッドを開始します。スレッドが実行されるためのさまざまな条件が満たされると、スレッドは作成状態になります。準備ができたキュー。

その他のさまざまな状態については、プロセスとスレッドの説明を参照してください。

スレッドの実装(TreadクラスとRunnableインターフェース)

Javaでスレッドを作成するには、Threadクラスを継承する方法とRunnableインターフェースを実装する方法の2通りがあります。具体的な導入は次のとおりです:

マルチスレッドは、Thread クラスとそのサブクラス、および Runnable インターフェイスを通じて Java で実装できます。

Thread クラスはスレッド オブジェクトを直接定義できますが、一般に、プログラミングの特別な要件を満たすマルチスレッドを実装するには、Thread クラスのサブクラスを定義する必要があります。 Java の単一継承による制限により、実際のアプリケーションでは、ほとんどすべてのマルチスレッド アプリケーションが実行可能インターフェイスを実装することによってマルチスレッドを実装します。

つまり、新しく作成したクラスが他のクラスを継承したい場合、Java では多重継承がサポートされていないため、マルチスレッドのタスクは java.lang.Runnable インターフェイスを実装することによってのみ完了でき、Runnable による処理に適しています。同じプログラム コードの複数のスレッド。同じリソースの場合、仮想 CPU (スレッド) はプログラムのコードとデータから効果的に分離されます。

2 つのスレッドの実装コードは次のとおりです:

public class ThreadDemo extends Thread {
     int i = 0;
     public void run(){
         while (i<10){
             System.out.println("实现Thread类继承的线程,正在占有处理机运行……"+i);
             try{
                 sleep(1000);
                 i++;
             }catch (InterruptedException e){
                 e.printStackTrace();
             }
         }
     }
}

main 関数では、クラスをインスタンス化し、start() メソッドを呼び出してスレッドを作成するだけです。

public class RunnableDemo implements Runnable {
    int i = 0;

    @Override
    public void run(){
        while (i<10) {
            System.out.println("实现Runnable接口的线程,正在占有处理机运行……" + i);
            try {
                Thread.sleep(1000);
                i++;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

main関数での実装方法:

Thread thread = new Thread(RunnableDemo );
Thread.start();

スレッドの基本制御

スレッドの開始: thread.start()

スレッドの終了: 対応するループとメソッドを終了するマーク変数を設定します

スレッドの実行を一時的にブロックします: Try{Thread.sleep(1000);}catch(InterruptedException e){ }

スレッドの優先順位を設定する: setPriority(int priority) メソッド

Max_priority スレッドが持つことができる最高の優先順位 (通常は 10)

Min_priority 最高の優先順位スレッドには次の 2 種類のスレッドがあります: ユーザー スレッド (ユーザー スレッド) とデーモン スレッド (デーモン スレッド) )、デーモン スレッドの役割は、ガベージ コレクション スレッドなどの他のスレッドの実行にサービスを提供することです。Java プログラムでは、デーモン以外のスレッドが存在すると、プログラム全体が終了しません。

スレッドのスケジューリング

Jvm はスレッドに CPU を割り当てる役割を果たします。これはスレッド スケジューリングと呼ばれます。その原理は、高優先度のスレッドが最初に同じ優先度の複数のスレッドを実行し、タイム スライスに従って CPU リソースを直接割り当てるというものです。回転

通过setDaemon(true)方法设定守护线程存在する問題

スレッドの不確実性: Java の単純なステートメントは、CPU 内の複数の命令に対応します。スレッドが命令を実行した直後にスケジュールされると、後続のスレッドが元のデータを繰り返し呼び出し、スレッドの不整合が発生します。決定的 (アトミックではない)

スレッド同期

スレッド同期: 同時に実行されているスレッドはデータを共有する必要があり、この時点で、同期を実現する必要があります。共有データ操作の整合性を確保するためのオブジェクト ミューテックス ロックの概念。各オブジェクトは、「ミューテックス ロック (lock、mutex)」と呼ばれるマークを持つモニター (monitor) に対応します。このマークは、常に 1 つのスレッドだけがそのオブジェクトにアクセスできるようにするために使用されます。キーワード synchronized は、オブジェクトのミューテックス ロックに接続するために使用されます

synchronized の使用法:

コード フラグメントの場合 synchronized (オブジェクト) {}

メソッドの場合: synchronized はメソッド宣言に配置され、 Public synchronized void Push (char c ){} は synchronized(this) と同等であり、メソッド全体が同期メソッドであることを示します

スレッド同期制御:

オブジェクトのロックを解放するには wait() メソッドを使用します

notify() または NoticeAll() を使用します1 つまたはすべての待機状態にすると、スレッドは準備完了状態になります

Java では、同期実行中に、スレッドはオブジェクトの wait メソッドを呼び出し、オブジェクトのロック識別子を解放します。その後、待機状態に入り、他のスレッドがnotify()またはnotify()メソッドを呼び出して、待機中のスレッドに通知します。

具体的なコードは次のとおりです:

  class CubbyHole {
        private int index = 0;
        private int[] data = new int[3];

        public synchronized void put(int value){
            while (index == data.length){
                try{
                    this.wait();
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
            data[index++] = value;
            this.notify();
        }

        public synchronized int get(){
            while (index <=0) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            int value = data[index--];
            this.notify();
            return value;
        }
}

別の問題

単純な同期では、ロックとロック解除によってデッドロックの問題、つまりお互いを待機するという問題が簡単に発生する可能性があります。 Java 1.5 以降では、マルチスレッドの問題を解決するためにいくつかのメソッドが導入されました。

同時実行 API (java.util.concurrent)

JDK1.5 以降では、単一変数、コレクション、タイマー、スレッド プールなど、より便利な一連の API が提供されています。

アトミック変数 java.util.concurrent.atomic パッケージ AtomicInteger クラス

GetAndIncrement() メソッドにより、スレッド アクセスが安全であることが保証されます

コンカレント コレクション クラス Java.util.concurrent パッケージは、いくつかのクラス CopyOnWriteArrayList および CopyOnWriteSet を追加します

非常に適したオブジェクトです書かれる量が減り、頻繁に読まれる

ConcurrentHashMap

ArrayBlockingQueue のプロデューサーとコンシューマーは put と get を使用します

スレッド プールを使用します

スレッド プール関連クラス ExecutorService インターフェイス、ThreadPoolExecutor クラス Executor ツール クラス

共通の使用法 ExecutorService pool = Executors.newCachedThreadPool()

そのexecute( Runnable r )メソッド

以上がこれは間違いなく Java マルチスレッドの最も詳細な説明ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。