Java マルチスレッドとは: マルチスレッドとは、プログラム内で複数の命令ストリームを同時に実行できるようにするメカニズムです。各命令ストリームはスレッドと呼ばれ、互いに独立しています。Java のすべての変数メインメモリに保存され、すべてのスレッドによって共有されます。
Java マルチスレッドの詳細な説明:
1. マルチスレッドについて理解する
マルチスレッドとは、プログラム内で複数の命令ストリームを同時に実行できるようにする仕組みで、各命令ストリームはスレッドと呼ばれ、互いに独立しています。スレッドは軽量プロセスとも呼ばれます。スレッドはプロセスと同様に独立した実行制御を持ち、オペレーティング システムによってスケジュールされます。違いは、スレッドが独立した記憶領域を持たず、所属するプロセス内の他のスレッドと記憶領域を共有することです。これにより、スレッド間の通信がプロセス間の通信よりもはるかに簡単になります。
Java メモリ モデルに特有のことですが、Java はクロスプラットフォーム言語として設計されているため、メモリ管理に関しては統一されたモデルが必要であることは明らかです。システムにはメインメモリ (Main Memory) があり、Java のすべての変数はメインメモリに格納され、すべてのスレッドで共有されます。各スレッドには独自の作業メモリ (作業メモリ) があります。作業メモリに格納されるのは、メイン メモリ内の一部の変数のコピーです。変数に対するスレッド操作はすべて作業メモリ内で実行されます。スレッドは相互に直接アクセスできません。変数の転送はメインメモリを通じて完了する必要があります。
複数のスレッドの実行は、物理的に「同時」であるかどうかに関係なく、同時、つまり論理的には「同時に」実行されます。システムに CPU が 1 つしかない場合、真の「同時性」は不可能です。マルチスレッドと従来のシングルスレッドのプログラミングにおける最大の違いは、各スレッドの制御フローが互いに独立しているため、各スレッド間のコードが順番どおりに実行されず、スレッドのスケジューリング、同期、その他の問題が発生することです。 。ネットワーク管理ネットワークビットCN.com
関連する学習推奨事項: java 基本チュートリアル
2. Java でのマルチスレッドの実装
新しいスレッドを作成するには何をする必要があるかを想像してみてはいかがでしょうか?明らかに、このスレッドで実行されるコードを指定する必要があります。Java でマルチスレッドを実装するために必要な作業はこれだけです。
完全なオブジェクト指向言語として、Java はマルチスレッド プログラミングを容易にするクラス java.lang.Thread を提供します。このクラスは、独自のスレッドの制御を容易にする多数のメソッドを提供します。
それでは、スレッドに実行させたいコードを Java に提供するにはどうすればよいでしょうか? Thread クラスを見てみましょう。 Thread クラスの最も重要なメソッドは run() です。これは Thread クラスのメソッド start() によって呼び出され、スレッドによって実行されるコードを提供します。独自のコードを指定するには、それをオーバーライドするだけです。
方法 1: Thread クラスを継承して run() メソッドを書き換える 作成した Thread クラスのサブクラスの run() を書き換えて、スレッドで実行するコードを追加します。以下に例を示します:
public class TwoThread extends Thread { public void run() { for ( int i = 0; i < 10; i++ ) { System.out.println("New thread"); } } public static void main(String[] args) { TwoThread tt = new TwoThread(); tt.start(); for ( int i = 0; i < 10; i++ ) { System.out.println("Main thread"); } } }
このメソッドはシンプルかつ明快で、誰の習慣にも合っていますが、大きな欠点もあります。 Thread.kind を継承できません。
方法 2: Runnable インターフェイスを実装する
Runnable インターフェイスにはメソッド run() が 1 つだけあり、クラスが Runnable インターフェイスを実装してこのメソッドを提供することを宣言し、スレッド コードをタスクのこの部分は完了です。ただし、Runnable インターフェイスではスレッドがサポートされていないため、Thread クラスのコンストラクター public Thread (Runnable target); を通じて Thread クラスのインスタンスを作成する必要もあります。以下は例です:
public class MyThread implements Runnable { int count=1, number; public MyThread(int num) { number = num; System.out.println("创建线程 " + number); } public void run() { while(true) { System.out.println("线程 " + number + ":计数 " + count); if(++count== 6) return; } } public static void main(String args[]) { for(int i = 0; i < 5; i++) new Thread(new MyThread(i+1)).start(); } }
Runnable インターフェイスを使用してマルチスレッドを実装すると、すべてのコードを 1 つのクラスに含めることができ、カプセル化が容易になります。マルチスレッドの使用におけるいくつかの問題を調べてみましょう。 。
3. スレッドの 4 つの状態
1. 新しい状態: スレッドは作成されましたが、まだ実行されていません (start() がまだ呼び出されていません)。 。
2. 実行可能状態: スレッドは実行可能ですが、必ずしも実行されているわけではありません。 CPU 時間はいつでもこのスレッドに割り当てられ、スレッドが実行される可能性があります。
3. ブロック状態: スレッドには CPU 時間が割り当てられず、実行できません。I/O でブロックされているか、同期ロックでブロックされている可能性があります。
4. 停止状態: 通常の状況では、run() が返されるとスレッドが停止します。 stop() または destroy() を呼び出しても同様の効果がありますが、前者は例外が発生し、後者は強制終了となりロックが解除されないため推奨されません。
4. スレッドの優先順位
线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。
你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。
五、线程的同步
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。
我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法:通过在方法声明中加入synchronized关键字来声明 synchronized 方法。synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法run()声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何synchronized方法的调用都永远不会成功。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) { //允许访问控制的代码 }
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject 的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
相关学习推荐:编程视频
以上がJava マルチスレッドとは何を指しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。