この記事では主にJavaでスレッドを作成する2つの方法と関連する例を詳しく紹介します
Javaでスレッドを作成する2つの方法
Javaは複数のスレッドを作成するためのスレッドクラスThreadを提供します。のスレッドプログラム。実際、スレッドを作成する操作は通常のクラス オブジェクトを作成するのと同じであり、スレッドは Thread クラスまたはそのサブクラスのインスタンス オブジェクトです。各 Thread オブジェクトは個別のスレッドを記述します。スレッドを生成するには、次の 2 つの方法があります:
◆Java.lang.Thread クラスから新しいスレッド クラスを派生し、その run() メソッドをオーバーロードする必要があります。
◆Runnalbeインターフェースを実装し、Runnalbe をオーバーロードする必要があります。インターフェイスの run() メソッド。
なぜ Java にはスレッドを作成するための 2 つのメソッドが用意されているのですか?それらの違いは何ですか?比較して、どちらの方法が優れていますか?
Java では、クラスは単一継承のみをサポートします。つまり、新しいクラスが定義されるときは、外部クラスのみを拡張できます。このように、Thread クラスのメソッドを拡張してカスタム スレッド クラスを作成すると、このカスタム クラスは他のクラスを拡張できず、より複雑な関数を実装できません。したがって、カスタム クラスが他のクラスを拡張する必要がある場合は、Runnable インターフェイスを実装するメソッドを使用してクラスをスレッド クラスとして定義し、Java 単一継承の制限を回避できます。
最も重要なことは、Runnableインターフェイスを実装して作成されたスレッドが同じリソースを処理できることで、リソースの共有が実現されることです
(1) Threadクラスを拡張してマルチスレッドを作成します
劇場には3つのスレッドがあるとします。 2 つのチケット売り場で、それぞれ子供、大人、高齢者向けのチケットが販売されます。劇場には、子供用チケット、大人用チケット、シニア用チケットの各窓口に 100 枚の映画チケットがあります。 3 つのウィンドウが同時にチケットを販売する必要がありますが、現在、チケット販売者は 1 つだけであり、このチケット販売者は CPU に相当し、3 つのウィンドウは 3 つのスレッドに相当します。これら 3 つのスレッドがプログラムによってどのように作成されるかを見てみましょう。
public class MutliThreadDemo { public static void main(String [] args){ MutliThread m1=new MutliThread("Window 1"); MutliThread m2=new MutliThread("Window 2"); MutliThread m3=new MutliThread("Window 3"); m1.start(); m2.start(); m3.start(); } } class MutliThread extends Thread{ private int ticket=100;//每个线程都拥有100张票 MutliThread(String name){ super(name);//调用父类带参数的构造方法 } public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+Thread.currentThread().getName()); } } }
プログラム内で Thread クラスを定義し、Thread クラスを拡張します。拡張スレッド クラスを使用して、MutliThreadDemo クラスの main メソッドで 3 つのスレッド オブジェクトを作成し、start() メソッドを通じてそれぞれを開始します。
各スレッドは 100 枚の映画チケットに対応しており、それらの間に関係がないことがわかります。これは、各スレッドが同等で優先関係がないことを意味するため、すべてのスレッドが CPU によって処理される機会があります。 。しかし、結果は、これら 3 つのスレッドが順番に交互に実行されるのではなく、3 つのスレッドが同時に実行されると、一部のスレッドにはタイム スライスが割り当てられる可能性が高く、チケットは事前に完売していることがわかります。タイムスライスが割り当てられており、撮影の機会が少なくなり、チケットは後で完売します。
Threadクラスを拡張して作成された複数のスレッドは、同じコードを実行しているにもかかわらず、互いに独立しており、それぞれが互いに干渉することなく独自のリソースを持っていることがわかります。
(2) Runnableインターフェースを実装してマルチスレッドを作成します
public class MutliThreadDemo2 { public static void main(String [] args){ MutliThread m1=new MutliThread("Window 1"); MutliThread m2=new MutliThread("Window 2"); MutliThread m3=new MutliThread("Window 3"); Thread t1=new Thread(m1); Thread t2=new Thread(m2); Thread t3=new Thread(m3); t1.start(); t2.start(); t3.start(); } } class MutliThread implements Runnable{ private int ticket=100;//每个线程都拥有100张票 private String name; MutliThread(String name){ this.name=name; } public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+name); } } }
これら3つのスレッドも互いに独立しているため、それぞれが独自のリソース、つまり映画チケット100枚を持っているため、プログラムは(1)と同じです 結果はほぼ同じです。各スレッドは、互いに影響を与えることなく、独自の 100 チケットを個別に処理します。
実際の状況では、新しく作成されたスレッドが互いに独立しており、独自のリソースを持ち、互いに干渉しないことが必要である限り、あらゆる方法を使用してマルチスレッドを作成できることがわかります。これら 2 つの方法で作成されたマルチスレッド プログラムは同じ機能を実現できるためです。
これら 3 つのスレッドは互いに独立しており、それぞれが独自のリソース、つまり 100 枚の映画チケットを持っているため、プログラムによって出力される結果は例 4.2.1 の結果と同様になります。各スレッドは、互いに影響を与えることなく、独自の 100 チケットを個別に処理します。
実際の状況では、新しく作成されたスレッドが互いに独立しており、独自のリソースを持ち、互いに干渉しないことが必要である限り、あらゆる方法を使用してマルチスレッドを作成できることがわかります。これら 2 つの方法で作成されたマルチスレッド プログラムは同じ機能を実現できるためです。
(3) Runnableインターフェースの実装により、スレッド間のリソース共有を実現
鉄道の駅の発券システムをシミュレートするなど、現実でもそのような場面があります。その日のチケットは 100 枚のみで、すべてのウィンドウがこれら 100 枚のチケットの販売を許可されている場合、各ウィンドウは 1 つのスレッドに相当しますが、前の例との違いは、すべてのスレッドによって処理されるリソースが同じリソースであることです。チケット100枚。以前の方法を使用してスレッドを作成した場合、この状況に対処するのは明らかに不可能です。次のプログラムを見てください。プログラム コードは次のとおりです。
public class MutliThreadDemo3 { public static void main(String [] args){ MutliThread m=new MutliThread(); Thread t1=new Thread(m,"Window 1"); Thread t2=new Thread(m,"Window 2"); Thread t3=new Thread(m,"Window 3"); t1.start(); t2.start(); t3.start(); } } class MutliThread implements Runnable{ private int ticket=100;//每个线程都拥有100张票 public void run(){ while(ticket>0){ System.out.println(ticket--+" is saled by "+Thread.currentThread().getName()); } } }
その結果、前に分析したように、プログラムはメモリ内に 1 つのリソースのみを作成し、新しく作成された 3 つのスレッドはすべて同じリソースへのアクセスに基づいています。各スレッドは同じコードを実行するため、同じ機能を実行します。
現実の問題で同じタスクを実行するために複数のスレッドの作成が必要で、複数のスレッドが同じリソースを共有する場合、Runnable インターフェイスを実装することでマルチスレッド プログラムを作成できることがわかります。この機能は Thread クラスを拡張することによって実現することはできません。なぜでしょうか。
Runnable インターフェースの実装には、Thread クラスの拡張に比べて比類のない利点があります。この方法は、プログラムの堅牢性を高めるだけでなく、コードを複数のスレッドで共有できるようにするだけでなく、コードとデータのリソースが比較的独立しているため、同じコードを持つ複数のスレッドが同じものを処理する状況に特に適しています。リソース。このようにして、スレッド、コード、データのリソースが効果的に分離され、オブジェクト指向プログラミングの考え方がよく反映されています。したがって、ほとんどすべてのマルチスレッド プログラムは、Runnable インターフェイスを実装することで完成します。
以上がJava でスレッドを作成するための 2 つのメソッドのコード共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。