Javaスレッド比較スレッド、実行可能、呼び出し可能
Javaはスレッドクラスを使用してスレッドを表し、すべてのフィールドオブジェクトはスレッドクラスまたはそのサブクラスのインスタンスでなければなりません。各スレッドの機能は、特定のタスクを完了することです。これは、実際にはプログラムフローを実行することです。 Javaは、スレッド実行ボディを使用して、このプログラムフローを表します。
1.スレッドクラスを継承してスレッドを作成します
マルチスレッドを開始する手順は次のとおりです。
(1)スレッドクラスのサブクラスを定義し、クラスのrun()メソッドをオーバーライドします。 run()メソッドのメソッドボディは、クラススレッドが完了する必要があるタスクを表します。したがって、run()メソッドはスレッド実行本体と呼ばれます。
(2)スレッドサブクラスのインスタンスを作成します。つまり、スレッドオブジェクトを作成します。
(3)スレッドのスター()メソッドを呼び出して、スレッドを起動します。
関連するコードは次のとおりです。
/ ***スレッドの内側クラスを継承してチケットを購入する例*/ public class firstthread extends thread {private int i;プライベートINTチケット= 10; @Override public void run(){for(; i <20; i ++){//スレッドを継承する場合、これを直接使用して現在のスレッドを取得します。 if(this.ticket> 0){log.e(tag、getname() + "、チケット販売:ticket =" + ticke--); }}}} private void starticketthread(){log.d(tag、 "starticketthread、"+thread.currentthread()。getName()); firstThread thread1 = new firstThread(); firstThread thread2 = new firstThread(); firstThread thread3 = new firstThread(); thread1.start(); thread2.start(); thread3.start(); //チケットを購入するために3つのスレッドを開き、各スレッドは10枚のチケットを販売し、合計30枚のチケット}実行結果:
3つのスレッドで入力された投票変数が連続していないことがわかります。注:チケットは、ローカル変数ではなくFirstThreadのインスタンスプロパティですが、プログラムはスレッドオブジェクトを作成するたびにFirstThreadオブジェクトを作成する必要があるため、すべての複数のスレッドはインスタンスの属性を共有しません。
2。実行可能なインターフェイスを実装して、スレッドを作成します
注:パブリッククラスのスレッドは実行可能です
(1)実行可能なインターフェイスの実装クラスを定義し、インターフェイスのrun()メソッドをオーバーライドします。 run()メソッドのメソッドボディは、スレッドのスレッド実行本文でもあります。
(2)実行可能なインスタンスクラスのインスタンスを作成します。このインスタンスは、スレッドオブジェクトを作成するためのスレッドターゲットとして使用されます。スレッドオブジェクトは実際のオブジェクトです。
関連するコードは次のとおりです。
/ ** *実行可能なインターフェイスを実装し、スレッドクラスを作成します */ public class secondThread実装runnable {private int i;プライベートINTチケット= 100; @Override public void run(){for(; i <20; i ++){//スレッドクラスが実行可能なインターフェイスを実装した場合// if(this.ticket> 0){log.e(tag、thread.currentthread()。getname() + "、チケット販売:チケット=" +チケット - ); }}}} private void starticketthread2(){log.d(tag、 "starticketthread2、"+thread.currentthread()。getName()); SecondThread SecondThread = new SecondThread(); //新しいスレッド(ターゲット、名前)新しいスレッド(SecondThread、 "Ticket Buyer 1")を介して新しいスレッドを作成します。start();新しいスレッド(SecondThread、 "Ticket Buyer 2")。start();新しいスレッド(SecondThread、 "Ticket Buyer 3")。start(); // 3つのスレッドが開かれましたが、合計で100枚のチケットのみが購入されました}実行結果:
3つのスレッドで入力された投票変数は連続的であり、複数のスレッドが実行可能なインターフェイスを使用してスレッドクラスのインスタンスのプロパティを共有できることがわかります。これは、プログラムによって作成された実行可能なオブジェクトが単なるスレッドのターゲットであり、複数のスレッドが同じターゲットを共有できるため、複数のスレッドが同じスレッドクラスのインスタンスプロパティを共有できるためです(実際にはスレッドのターゲットクラスになるはずです)。
3.呼び出し可能な未来を使用してスレッドを作成します
Java 5から始まるJavaは、Runnableの拡張バージョンである呼び出し可能なインターフェイスを提供します。 Callableは、スレッド実行本体として使用できる()メソッドと呼ばれるクラスを提供しますが、Call()メソッドはより強力です。
(1)call()メソッドには戻り値を持つことができます(2)call()メソッドはスローされた例外を宣言できます
したがって、スレッドターゲットとして呼び出し可能なオブジェクトを提供することができ、スレッドの執行者は呼び出し可能なオブジェクトの呼び出し()メソッドです。同時に、Java 5は、callableインターフェイスのcall()メソッドの返品値を表すための将来のインターフェイスを提供し、FutureTask実装クラスを提供します。この実装クラスは、将来のインターフェイスを実装し、実行可能なインターフェイス(スレッドクラスとして使用できるターゲット)を実装します。
スタートアップの手順は次のとおりです。
(1)呼び出し可能なインターフェイスの実装クラスを作成し、call()メソッドを実装します。 call()メソッドは、スレッドの実行本体として使用され、call()メソッドには返品値があります。
(2)呼び出し可能な実装クラスのインスタンスを作成し、FutureTaskクラスを使用して呼び出し可能なオブジェクトをラップします。 FutureTaskオブジェクトは、call()メソッドの返品値をカプセル化します。
(3)futureTaskオブジェクトをスレッドオブジェクトのターゲットとして使用して、新しいスレッドを作成して起動します。
(4)futureTaskオブジェクトのget()メソッドを呼び出して、子スレッドが実行された後に戻り値を取得します。
関連するコードは次のとおりです。
/ ***呼び出し可能なスレッドクラスを実装するために使用できます*/ public class 3番目のスレッドを実装するコール可能<integer> {private int ticket = 20; @Override public Integer call(){for(int i = 0; i <10; i ++){//現在のスレッドを取得するには、現在のスレッド名// log.d(tag、thread.currentthread()。 if(this.ticket> 0){log.e(tag、thread.currentthread()。getname() + "、chootets:ticket =" + ticke--); }}返品チケット; }} private void starcallablethread(){thirdthread thirdthread = new ThirdThread(); FutureTask <Integer> task = new FutureTask <Integer>(ThirdThread);新しいスレッド(タスク、 "return valueのスレッド")。start(); try {integer integer = task.get(); log.d(tag、 "starcallablethread、子スレッドの返品値="+integer); } catch(arturnedexception e){e.printstacktrace(); } catch(executionException e){e.printstacktrace(); }}実行結果:
注:callableのcall()メソッドにより、宣言は例外をスローし、返品値を許可します。
プログラムは最終的に、FutureTaskオブジェクトのget()メソッドを呼び出して、call()メソッドの返される値を返し、call()メソッドが終了して戻るまでメインスレッドをブロックします。
4。3つの方法の比較
スレッドクラスを継承してマルチスレッドを作成します
短所:スレッドクラスが継承されている他の親クラスから継承することはできません。
利点:簡単に書くことができます
実行可能で呼ばれるインターフェイスを継承する方法を使用してマルチスレッドを作成する
短所:プログラミングは少し複雑です。現在のスレッドにアクセスする必要がある場合は、thread.currentthread()を使用する必要があります。
利点:
(1)他のクラスを継承することもできます(2)複数のスレッドがターゲットオブジェクトを共有できるため、複数の同一のスレッドが同じリソースを処理するために非常に適しているため、CPU、コード、データを分離して明確なモデルを形成し、クラスのオブジェクト指向のアイデアをよりよく反映します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!