この記事は、Javaマルチスレッドの基本的な使用法の要約です。
この記事では、次の側面からのJavaマルチスレッドの基本的な使用について説明します。
マルチスレッドの使用方法
スレッドを開始する2つの方法
Javaは、マルチスレッドを使用する2つの方法を提供します。 1つは、スレッドを継承するクラスを作成し、実行方法を上書きし、スレッドを開始するために開始メソッドを呼び出すことです。この時点で、このクラスは、別のスレッドの方法で実行方法でコードを実行します。別の方法は、クラスを作成して実行可能なインターフェイスを実装し、インターフェイスメソッドの実行を実装し、スレッドオブジェクトを作成し、実行可能なインターフェイスを構成パラメーターとして実装するクラスを使用し、スレッドオブジェクトに渡し、最後にスレッドオブジェクトが開始メソッドを呼び出すことです。
ここでの開始方法は、スタートアップ関数を備えた方法であり、実行方法を内部的に呼び出します。したがって、Startメソッドが呼び出された場合にのみ別のスレッドが開始されると、実行方法は直接呼び出されるか、別のスレッドで実行されるのではなく、同じスレッドで実行されます
さらに、STARTメソッドは、スレッドを起動できることを仮想マシンに伝えるだけです。つまり、スレッドは準備ができた状態にあることを意味しますが、開始する呼び出しがすぐに実行されることを意味しません。これには、JVMがスレッドをいつ実行するかを決定するのを待つ必要があります。言い換えれば、2つのスレッドAとBがある場合、呼び出しが最初に開始され、B呼び出しが後で開始されると、スレッドAが最初に実行され、スレッドBが後で実行されることを意味しません。これはすべてJVMによって決定され、ランダムスタートアップと見なすことができます。
以下では、実際のコードを使用して、2つの方法を説明してスレッドを開始します。
最初のタイプはスレッドを継承することです
public class examplethread extends thread {@override public void run(){super.run(); system.out.println( "これはスレッドから継承された試験版です"); }}テストコードは、Test DirectoryのExamplethreadTestクラスにあります
別の方法では、実行可能なインターフェイスを実装します
public class examplerunable runnable {public void run(){system.out.println( "これは実行可能なインターフェイスを実装するクラスです"); }}テストコードでは、Test DirectoryにExamplerunableTestクラスを見ることができます。
マルチスレッドに関する情報を取得する方法
マルチスレッドを開始した後、いくつかのAPIを介して開始スレッドに関する情報を取得したいと考えています。 JDKは、スレッドに関する情報を取得するためのスレッドクラスメソッドを提供します。
スレッドの名前を取得します
これらの方法はスレッドの内部方法であるため、これらの方法を2つの方法で呼び出すことができます。 1つは、クラスがスレッドを継承してマルチスレッドを使用する場合、これを使用して呼び出すことができるということです。別の方法は、thread.currentthread()を介してこれらのメソッドを呼び出すことです。ただし、これらの2つの方法は、使用シナリオによって異なります。
2つの方法の使用を簡単に見てみましょう。
最初のthread.currentthread()が使用されます。コードは次のとおりです。
public class examplecurrentthread extends thread {public examplecurrentthread(){system.out.println( "コンストラクターの印刷:" + thread.currentthread()。getName()); } @Override public void run(){super.run(); system.out.println( "実行方法の印刷:" + thread.currentthread()。getName()); }}テストコードは次のとおりです。
public class examplecurrentThreadTestはextends testcase {public void testinit()throws exception {examplecurrentThread swread = new ExampleCurrentThread(); } public void testrun()throws exception {exampleCurrentThreadスレッド= new ExamPleCurrentThread(); thread.start(); thread.sleep(1000); }}結果は次のとおりです。
コンストラクターの印刷方法:マインラン方法の印刷方法:スレッド0構造方法の印刷:メイン
thread.currentthread()がmainとして印刷されていることをshured.currentthread()内部のshood.currentthread()を使用して使用する理由は、thread.currentthread()がそのスレッドによってコードセグメントが呼び出されている情報を返すためです。構築方法がメインスレッドによって実行され、実行方法は私たちが始めたスレッドによって実行されることは明らかです。名前が付けられていないため、デフォルトのスレッド0です。
次に、スレッドから継承して、これで呼び出します。
public class complexCurrentThread extends thread {public complexCurrentThread(){system.out.println( "begin =================="); system.out.println( "thread.currentthread()。getname =" + thread.currentthread()。getname()); System.out.println( "this.getName()=" + this.getName()); System.out.println( "end ================================================ system.out.println( "swreat.currentthread()。テストコードは次のとおりです。
public class complexCurrentThreadTestはtestcaseを拡張します{public void testrun()throws Exception {complexCurrentThread swread = new ComplexCurrentThread(); thread.setname( "byhieg"); thread.start(); thread.sleep(3000); }}結果は次のとおりです。
begin ============= currentthread()
まず、オブジェクトを作成するとき、コンストラクターはメインスレッドによってまだ実行されるため、thread.currentthread()がメインスレッドの名前を取得しますが、このメソッドはメソッド、つまりcomplexCurrentThreadのスレッド情報を呼び出すオブジェクトを指します。まだsetNameがないので、デフォルト名です。実行方法は、thread.currentthread()のいずれかです。または、これにより、byhieg名セットでスレッド情報を返します。
したがって、thread.currentthreadは、このコードブロックを具体的に実行するスレッド情報を指します。コンストラクターはメインによって実行され、実行方法はどのスレッドが起動し、どのスレッドが実行されるかが実行されます。この観点から見ると、これが得られる情報は不正確です。これは、実行中にthis.getName()を実行すると、実行方法が別のスレッドによって開始される場合、新しい都市の情報を実行している情報を取得できないためです。スレッドを継承するクラスのみが、getNameなどのメソッドを持つことができます。これは、複数の継承がないJavaの機能言語の災害です。その後に取得したいスレッドに関するすべての情報については、swerch.currentthread()を使用してAPIを呼び出します。
スレッドのIDを取得します
GetIDに電話して、スレッドの一意の識別を取得します。これは、上記のGetNameの使用と同じです。言うことは何もありません。 ExampleIdThreadとそのテストクラスのExampleIdthreadTestを直接確認できます。
スレッドが生き残るかどうかを判断します
メソッドISALIVE()の機能は、スレッドがアクティブかどうかをテストすることです。いわゆるアクティブ状態は、スレッドが開始されたが終了していないことを意味します。つまり、スレッドが始まった後、生きていると見なされます。
具体的な例を見てみましょう。
public class alivethread extends thread {@override public void run(){super.run(); system.out.println( "それは実行方法で生きていますか" + "" + thread.currentthread()。isalive()); }}テスト方法は次のとおりです。
Public Class AlivethreadTestはtestcaseを拡張します{public void testrun()throws Exception {alivethread thread = new Alivethread(); System.out.println( "begin ==" + thread.isalive()); thread.start(); thread.sleep(1000); System.out.println( "end ==" + thread.isalive()); thread.sleep(3000); }}結果は次のとおりです。
begin == false method == falseのTrueEndかどうか
開始前に、スレッドは容認されていないと見なされ、それが実行されると生きていることがわかります。実行メソッドが実行されると、それは監督されていないと見なされます。
スレッドを停止する方法
スレッドが終了したかどうかを判断します
JDKは、スレッドが終了したかどうかを判断するためのいくつかの方法を提供します-ISTERURTERRUREDED()とfutruded()
スレッドを停止する方法
これは、スレッド情報を終了する方法に関連しているため、スレッド情報の取得においてより重要な方法です。最初にスレッドを終了するいくつかの方法について話させてください:
最初のものについては話しません。次の理由が発生する可能性があるため、2番目のSTOP()メソッドが放棄されました。
特定の例については、stoplockthreadとそのテストクラスstoplockthreadtestを見ることができます
3番目のタイプは、現在推奨されている終了方法で、割り込みを呼び出してから、実行方法で終了するかどうかを決定します。終了を判断するには、2つの方法があります。 1つはスレッドクラスの静的メソッド()が中断された()、もう1つはスレッドメンバーのメソッドが中断()()です。これら2つの方法には違いがあります。最初の方法は、状態を自動的にリセットします。中断された()が2回連続で呼び出された場合、それが最初に偽である場合、2回目は真でなければなりません。 interinterrupded()はしません。
例は次のとおりです。
public class example internurpthread extends thread {@override public void run(){super.run(); try {for(int i = 0; i <50000000; i ++){if(arterned()){system.out.println( "それはすでに停止状態です、終了したい"); new interruptedexception( "Stop ......"); } system.out.println( "i =" +(i + 1)); }} catch(arturnedexception e){system.out.println( "smootly"); }}}テストコードは次のとおりです。
public class example internuptthreadtestはtestcaseを拡張します{public void testrun()throws exception {emblyinterpurtthread thread = new emblerSurpthRead(); thread.start(); thread.sleep(1000); thread.interrupt(); }}4番目の方法は、3番目の方法と同じです。唯一の違いは、上記のコードのスローされた例外を返されることです。私はまだ例外を投げるのが好きです。ここには、情報の印刷、リソースの閉鎖またはキャプチャ、その後再び上層に投げるなど、多くの形式の処理があります。
上に投げた例外は中断のエクセプトであることに注意してください。ここでは、この例外が生成される理由について簡単に説明します。元のスレッドスリープの場合、割り込みを呼び出してスレッドを終了するか、最初にスレッドを終了してから、スレッドをスリープします。
スレッドを一時停止する方法
JDKでは、スレッドを一時停止し、スレッドを復元するための次の2つの方法が提供されています。
これらの2つの方法は、停止方法のような放棄された方法であり、それらの使用法は停止と同じであり、スレッドを残酷に停止し、スレッドを復元します。これらの2つの方法が放棄される主な理由は次のとおりです。
スレッドの他のいくつかの使用
スレッドのその他の基本的な使用法は次のとおりです。
スレッドコンセッション
JDKは、スレッドに現在のCPUリソースを放棄し、CPU時間を占める他のタスクに譲るためのYield()方法を提供しますが、これもランダムなものです。リソースを放棄した直後に時間のスライスをかける可能性があります。
具体的な例については、empleryieldthreadとそのテストクラスを参照してください。
スレッドの優先順位を設定します
スレッドの優先順位を設定して、CPUを可能な限り優先してスレッドに実行リソースを送信できるようにすることができます。 Javaは1-10 10優先レベルを設定し、3つの優先度レベルを提供する3つの静的変数があります。
/***スレッドが持つことができる最小優先度。 */ public final static int min_priority = 1; /***スレッドに割り当てられたデフォルトの優先度。 */ public final static int norm_priority = 5; /***スレッドが持つことができる最大優先度。 */ public final static int max_priority = 10;
Setpriorityを介してスレッドの優先順位を設定することができ、3つの静的変数を直接渡すことができます。設定後、スレッドには異なる優先順位があります。優先順位を設定しないとどうなりますか?
スレッドの優先順位は継承されます。スレッドAでスレッドBを開始すると、ABに同じ優先順位があります。一般に、メインスレッドでスレッドを開始すると、メインスレッドと一貫した優先順位があります。メインスレッドの優先度はデフォルトで5です。
優先順位のルールがいくつかあります。
スレッドガード
JDKは、デーモンスレッドになるようにスレッドを設定するSetDaemonメソッドを提供します。デーモンスレッドの特徴は、他のデーモン以外のスレッドが実行された後、デーモンスレッドが自動的に破壊されることです。典型的な例は、GCリサイクラーです。
詳細については、ExampledaemonThreadおよびExampledaemonThreadTestをご覧ください。
要約します
この記事では、主にJavaスレッドのいくつかの基本的な使用法をまとめており、スレッドの安全性と同期に関する2番目の記事に含まれています。
上記はこの記事のすべての内容です。この記事の内容が、すべての人の勉強や仕事に役立つことを願っています。また、wulin.comをもっとサポートしたいと思っています!