1.マルチスレッドを知っている
プロセスとスレッド
- スレッドはプロセスに基づいて分割されます。プロセスは、プログラムの動的な実行プロセスであり、コードのロード、実行、実行の完了までの完全なプロセスを経ています。このプロセスは、生成、開発、最終的な終了までのプロセス自体のプロセスでもあります。
- マルチスレッドは、並行性メカニズムを実現するための効果的な手段です。スレッドのようなプロセスは、並行性の基本単位です。
Javaのマルチスレッド実装
- Threadクラスを継承します
- Runnableインターフェースを実装する
- スレッドクラス
Threadクラスはjava.langパッケージで定義されています。クラスがThreadクラスを継承している限り、このクラスはマルチスレッド操作クラスと呼ばれます。Thraサブクラスでは、スレッドの本体であるThreadクラスのRun()メソッドを明示的にオーバーライドする必要があります。
マルチスレッド定義構文
[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-SNguYkBc-1610103102719)(https://uploader.shimo.im/f/ xBNe7j0JnuGueHI5.png!thumbnail?fileGuid = VT8YkHRTjJdQt9dG)]
場合:
class XC extends Thread{
private String name;
public XC(String name){
this.name=name;
}
public void run(){
for(int i=0;i<10;i++){
System.out.println(name+"运行"+(++i));}}}
スレッドをテストしてみましょう
public static void main(String[] args) {
XC xc1=new XC("线程A");
XC xc2=new XC("线程B");
xc1.run();
xc2.run();}
演算結果:
上記のプログラムが通常のメソッドで呼び出されているため、オブジェクトのメソッドを呼び出すことにより、操作の結果が順番に実行され、交互に実行されることはありませんが、スレッドを開始する場合は、Startを使用する必要がありますマルチスレッドを開始するためのThreadクラスのメソッド。
startメソッドを使用した後の実行結果
public static void main(String[] args) {
XC xc1=new XC("线程A");
XC xc2=new XC("线程B");
xc1.start();
xc2.start();}
2つのスレッドが同時に実行されていることがわかります。最初にcpuタイムスライスを取得するスレッドが最初にスレッドを実行します。ここでは、startの実装について説明します。
ここで、Startメソッドはrun()メソッドを呼び出しますが、run()メソッドを直接呼び出せないのはなぜですか?
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);}}
private native void start();
start()メソッドは例外をスローする場合があります。
stopBeforeStartはブール変数です。
ネイティブキーワードは、Javaがネイティブオペレーティングシステム関数を呼び出すために使用するキーワードを表します。JavaでJavaプログラムを実行すると、ネイティブオペレーティングシステム関数が呼び出され、特定の関数が完成します。
マルチスレッドを実装する必要がある場合は、オペレーティングシステムのサポートが必要です。これは、マルチライン操作にはCPUがプリエンプションされる状況が含まれ、CPUがスケジュールされるのを待つ必要があるためです。これには、オペレーティングシステムなので、ネイティブコールを使用する必要がありますマシンのシステム機能。
- Runnableインターフェースを実装する
Javaでは、Runnableインターフェースを実装することでマルチスレッドを実装することもできます。Runableインターフェースで定義されている抽象メソッドは1つだけです。
Runableインターフェースを介したマルチスレッド
例:
class RunDemo implements Runnable{
private String name;
public RunDemo(String name){
this.name=name;
}
public void run(){
for(int i=0;i<3;i++){
System.out.println(name+"运行"+i);}}}
実装クラス:
public static void main(String[] args) {
RunDemo xc2=new RunDemo("线程A");
RunDemo xc3=new RunDemo("线程B");
Thread t1=new Thread(xc2);
Thread t2=new Thread(xc3);
t1.start();
t2.start();}
演算結果:
実行中のエフェクトから、マルチスレッド機能が完了していることがわかります。
スレッドと実行可能なインターフェイス
2つの間の接続
public class Thread
extends Object
implements Runnable
スレッドがRunnableインターフェースを実装していることがわかります。これは、ThreadがRunableのサブクラスであることがわかります。
2つの違い
Threadクラスを使用すると、複数のスレッドを操作するときにリソース共有の目的を達成できず、Runnableインターフェイスの実装によってリソース共有を達成できます。
ここでは、比較のために3つのウィンドウで5枚のチケットを販売する例を取り上げます。
- 実装するThreadクラスを継承します
class T extends Thread{
private int ticketN=3;
private String name;
public T(String name){
this.name=name;
}
public void run(){
for(int i=0;i<10;i++) {
if (this.ticketN > 0) {
System.out.println(name + "卖票:ticket=" + ticketN--); }}}}
public class Ticket {
public static void main(String[] args) {
T t1=new T("窗口A");
T t2=new T("窗口B");
T t3=new T("窗口C");
t1.run();
t2.run();
t3.run();
}
}
演算結果:
ここでは、各スレッドに独立したリソースがあり、各スレッドに3つの販売チケットがあり、リソースが共有されていないことを示しています。
- Runnableを実装する方法
class R implements Runnable{
private int ticketN=3;
public void run(){
for(int i=0;i<10;i++) {
if (this.ticketN > 0) {
System.out.println( "卖票:ticket=" + ticketN--); }}}}
クラスの実行:
public static void main(String[] args) {
R r1 = new R();
Thread t1=new Thread(r1);
Thread t2=new Thread(r1);
Thread t3=new Thread(r1);
t1.run();
t2.run();
t3.run();}
演算結果:
3つのスレッドが作成されましたが、3つのスレッドで合計5つのチケットが販売されたことがわかります。
スレッドおよび実行可能インターフェースの使用の結論
実行可能な利点
- 次回同じリソースを処理するときに、複数の同じプログラムコードに適しています。
- 単一継承の制限によって引き起こされる影響を回避できます。
- プログラムの堅牢性を強化し、コードを複数のスレッドで共有でき、コードとデータは独立しています
統合された実行可能なインターフェイスの方が優れています。
スレッドステータス
- 状態を作成し、マルチスレッドインスタンスを返す準備をします。Threadt= newThread();
- 準備完了状態、startメソッドを呼び出します
- 実行ステータス:run()メソッドを呼び出します
- ブロック状態で、実行を一時的に中断し、他のスレッドにリソースを提供して使用できるようにする場合があります。