オペレーティングシステムの以前のプロセスとスレッドで、スレッドについて詳しく説明しましたが、Javaでのマルチスレッドの実装については、この記事でさらに詳しく説明します。
Java のスレッド ステータスについては、次の 5 つの状態モデルを使用して表すことができます:
作成、準備完了、実行中、ブロック、終了の 5 つの状態
作成ステータス: JVM はmain() メソッド メインスレッドを作成します。メインスレッドは、スレッドオブジェクトの start() メソッドを呼び出して子スレッドを開始します。スレッドが実行されるためのさまざまな条件が満たされると、スレッドは作成状態になります。準備ができたキュー。
その他のさまざまな状態については、プロセスとスレッドの説明を参照してください。
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)方法设定守护线程
存在する問題
スレッド同期
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)
アトミック変数 java.util.concurrent.atomic パッケージ AtomicInteger クラス
コンカレント コレクション クラス Java.util.concurrent パッケージは、いくつかのクラス CopyOnWriteArrayList および CopyOnWriteSet を追加します
非常に適したオブジェクトです書かれる量が減り、頻繁に読まれる
ConcurrentHashMap
ArrayBlockingQueue のプロデューサーとコンシューマーは put と get を使用します
スレッド プールを使用します
スレッド プール関連クラス ExecutorService インターフェイス、ThreadPoolExecutor クラス Executor ツール クラス
共通の使用法 ExecutorService pool = Executors.newCachedThreadPool()
そのexecute( Runnable r )メソッド
以上がこれは間違いなく Java マルチスレッドの最も詳細な説明ですの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。