1。スレッドの基本概念
スレッドの理解:スレッドはプログラム内の異なる実行パスです
各ブランチはスレッドと呼ばれ、main()はメインブランチと呼ばれ、メインスレッドとも呼ばれます。
プロセスは、静的な概念、マシン上の.classファイル、マシン上の.exeファイルであり、これはプロセスと呼ばれます。プログラムの実行プロセスは次のとおりです。最初に、プログラムのコードをメモリのコード領域に入れます。コードがコード領域に配置された後、すぐに実行を開始しません。ただし、これはプロセスを開始する準備ができていることを意味します。このプロセスは生成されましたが、まだ実行を開始していません。これがプロセスであるため、プロセスは実際には静的な概念であり、それ自体で動かすことはできません。通常のプロセス実行とは、実行を開始するプロセスのメインスレッド、つまりメイン()メソッドが実行を開始することを指します。プロセスは静的な概念であり、実際にはマシンでスレッドが実行されます。
Windowsオペレーティングシステムは、マルチスレッドをサポートしています。同時に多くのスレッドを実行することができ、複数のプロセスもサポートします。したがって、Windowsオペレーティングシステムは、マルチスレッドとマルチプロセスをサポートするオペレーティングシステムです。 LinuxとUInuxは、マルチスレッドとマルチプロセスをサポートするオペレーティングシステムでもあります。 DOSは、マルチスレッドとマルチプロセスをサポートしていません。単一のプロセスのみをサポートします。同じ時点で実行されているプロセスは1つだけです。これは、単一スレッドと呼ばれます。
CPUは本当に強力で、非常に多くのプログラムを同時に実行できますか?いいえ、CPUの実行は次のとおりです。CPUは非常に高速であり、1秒で数億回カウントできるため、CPUは時間を小さな時間スライスに分割します。今回はしばらくスライスを実行し、次回スライスがしばらくそれを実行し、次回スライスがしばらく他の人を実行するときに実行します。いくつかのスレッドがありますが、それらは非常に短い時間でそれらすべてを実行できます。しかし、私たちの人間にとって、CPUの実行速度は速すぎるため、同時に実行されているように見えますが、実際には、CPUで実行されているスレッドは1つだけです。
まず、スレッドを学習するときに3つの概念を理解する必要があります。
1。プロセス:プロセスは静的な概念です
2。スレッド:Main()メソッドと呼ばれるプロセスにはメインスレッドがあります。これはプログラムであり、プロセスには異なる実行パスです。
3。同時に、CPUは1つのスレッドのみをサポートすることができます。 CPUは非常に速く実行されるため、マルチスレッドのように見えます。
真のマルチスレッドとは何ですか?マシンにデュアルCPUまたはデュアルコアがある場合、それは実際にマルチスレッドされています。
2。スレッドの作成と起動
Javaでは、Javaスレッドはjava.lang.threadクラスを通じて実装され、各スレッドオブジェクトは新しいスレッドを表します。新しいスレッドを作成するには2つの方法があります。1つ目は、スレッドクラスから継承することであり、もう1つはインターフェイスが実行可能なインターフェイスを実装することです。 VMが起動すると、メインメソッド(public static void main())によって定義されたスレッドがあり、このスレッドはメインスレッドと呼ばれます。新しいスレッドは、スレッドのインスタンスを作成することで作成できます。スレッドオブジェクトを新しい新しいスレッドが表示するだけです。各スレッドは、特定のスレッドオブジェクトに対応するメソッドrun()を介して操作を完了します。メソッドrun()は、スレッドボディと呼ばれます。
例1:実行可能なインターフェイスの実装を使用して新しいスレッドを作成して起動します
実行方法を呼び出す新しいスレッドを作成します
パッケージcn.galc.test; public class testthread1 {public static void main(string args []){runner1 r1 = new runner1(); //スレッドクラスの新しいオブジェクトが登場// r1.run(); //これはメソッド呼び出しと呼ばれます。メソッドコールの実行は、Main()メソッドが引き続き実行される前に実行()メソッドが実行されるまで待機することです。スレッドT =新しいスレッド(R1); //新しいスレッドを起動するには、新しいスレッドオブジェクトが出てくる必要があります//スレッド(実行可能ターゲット)がここで使用されます。コンストラクターt.start(); //新しく開かれたスレッドを起動し、新しいスレッドはrun()メソッドを実行し、新しいスレッドとメインスレッドは(int i = 0; i <10; i ++){system.out.println( "maintheod:"+i); }}}/*実行可能なインターフェイスを実装するクラスを定義します。実行可能なインターフェイスを実装することは、このクラスがスレッドクラス*/クラスrunner1を実装することを意味します。runnable{public void run(){for(int i = 0; i <10; i ++){system.out.println( "runner1:"+i); }}}マルチスレッドプログラムの実行プロセスは次のとおりです。
新しいスレッドを開かずに実行方法を直接呼び出す
操作結果は次のとおりです。
例2:スレッドクラスを継承し、run()メソッドをオーバーライドして新しいスレッドを作成して起動する
パッケージcn.galc.test;/*スレッド作成と起動の2番目の方法:スレッドのサブクラスを定義し、run()メソッドを実装*/public class testthread2 {public static void main(string args []){runner2 r2 = new runner2(); r2.start(); // start()メソッドを呼び出して、(int i = 0; i <= 10; i ++){system.out.println( "mainmethod:"+i); }}}/*runner2クラスのclassは、runner2クラスのオブジェクトをインスタンス化することにより、スレッドクラスから継承すると、新しいスレッドを開くことができます。スレッドクラスから継承されたstart()メソッドを呼び出します。新しく開かれたスレッド*/class runner2 extends thread {public void run(){//(int i = 0; i <= 10; i ++){system.out.println( "runner2:"+i); }}}2つの方法を使用して新しいスレッドを作成するという選択、つまり実行可能なインターフェイスの実装とスレッドクラスの継承は、新しいスレッドを開くことを優先する必要があります。インターフェイスの実装は複数を実装できるため、クラスの継承は単一の継承のみになります。したがって、新しいスレッドを開くときに実行可能なインターフェイスを使用できる場合は、スレッドクラスから継承を使用して新しいスレッドを開きます。
3。スレッド状態の遷移
3.1。スレッド制御の基本的な方法
3.2。スリープ/参加/収量方法の紹介
睡眠方法の適用例:
パッケージcn.galc.test; Import java.util。*; public class testthread3 {public static void main(string args []){mythread thread = new mythread(); thread.start(); // start()メソッドを呼び出して新しく開いたスレッドを起動しますtry {/* thread.sleep(10000); sleep()メソッドは、スレッドクラスで宣言された静的な方法であるため、thread.sleep()の形式を使用して * / /*mythread.sleep(10000)を呼び出すことができます。 Mythreadクラスはスレッドクラスを継承し、自然にSleep()メソッドも継承するため、mythread.sleep() *// *静的メソッドの呼び出しは、「class name.static method name」または「object actatic method name " */ mythread.sleep(10000)の形式で直接呼び出すことができます。 System.out.println( "メインスレッドは10秒間眠り、再び開始します"); //メイン()メソッドで別のクラスの静的メソッドを呼び出す場合、「静的メソッドが配置されているclass.staticメソッド名」を使用する必要があります /*したがって、ここでは、メインスレッドを10秒間眠らせることです。どのスレッドがSleep()メソッドを呼び出すため、メインスレッドが睡眠になりました。 */} catch(arturnedexception e){e.printstacktrace(); } //thread.interrupt();//use incurtion()メソッドスレッドスレッドの実行を終了する方法。flag = false; //デッドループ条件を変更して終了します/** *中断の条件が発生したら、falseに直接設定して死んだループを終了し、 *子スレッドの実行を終了します。これは、子スレッドを終了するためのより良い方法です* / / *** corning indratider()メソッドは、ランニングスレッドを破ることは、メインスレッドに冷たい水のポットを注ぎ、実行するサブスレッドを破るのと同等です。実行されたサブスレッドが中断された後、中断されたエクセプトがスローされ、returnステートメントが実行され、スレッドの実行が終了します。したがって、ここのサブスレッドは、10秒の実行後にスレッドの実行を終了します */}} class mythread extendsスレッド{boolean flag = true; //タグを定義してループパブリックボイドの条件を制御する{/ * *注:ここでは、ランをスローするためにランをスローする必要があるため、run()方法をスローする必要があるため、run()方法をスローする必要があるため、スロー例外を直接書き込むことはできません。書き換えられた方法よりも例外。 *したがって、ここでは、例外をキャッチするためにtry ... catch()を書くことができます*/ while(flag){ System.out.println( "================================================================================================ =============================================================================== =============================================================================== =============================================================================== =============================================================================== =============================================================================== ================================================================================もちろん、「クラス名」の形式を使用してそれを呼び出すことは間違っていません*/ // mythread.sleep(1000);死んだループでは、現在のシステム時間が毎秒印刷されます}キャッチ(中断e){ /**睡眠のプレートは睡眠を中断する可能性があります。実行結果:
結合方法の例:
パッケージcn.galc.test; public class testthread4 {public static void main(string args []){mythread2 shood2 = new mythread2( "mythread"); //新しいスレッドオブジェクトを作成しているときに、スレッドオブジェクトMythread Thread2.start(); // try {thread2.join(); // join()メソッドを呼び出してスレッドをマージするためにmythreadをマージする、//スレッドをマージした後、プログラントの実行プロセスは、e.prant e)の実行プロセスと同等です( } for(int i = 0; i <= 5; i ++){system.out.println( "i a are main thread"); }}} class mythread2 extends thread {mythread2(string s){super(s); / * *スーパーキーワードを使用して、親クラスのコンストラクターを呼び出す *親クラススレッドのコンストラクターの1つ:「パブリックスレッド(文字列名)」 *このようなコンストラクターを介して、新しく開いたスレッドの名前を付けます。 //使用// parent classスレッドで定義されているpublic final String getName()は、このスレッドの名前を返します。 try {sleep(1000); //実行されるたびに子スレッドを1秒間眠らせます} catch(arternedexception e){return; }}}}実行結果:
収量方法の使用例:
パッケージcn.galc.test; public class testthread5 {public static void main(string args []){mythread3 t1 = new mythread3( "t1"); /* 2つの子スレッドT1とT2が同時に開かれました。 T1とT2は両方ともrun()メソッドを実行します*//*このプログラムの実行中に合計3つのスレッドがあります。 t1.start(); //スターターチャイルドスレッドt1 t2.start(); //スターターチャイルドスレッドt2 for(int i = 0; i <= 5; i ++){system.out.println( "I a mainスレッド"); }}} class mythread3 extends thread {mythread3(string s){super(s); } public void run(){for(int i = 1; i <= 5; i ++){system.out.println(getname() + ":" + i); if(i%2 == 0){hired(); //実行に到達すると、私は2で分割できます。現在のスレッドの実行が与えられ、run()メソッドを最初に実行する別のスレッドを実行します/ * *スレッドT1が実行されると、 * * *スレッドが最初に実行され、スレッドが実行されます。時間、それは優先順位の実行にt1スレッドにスレッドを与えます */}}}操作結果は次のとおりです。
上記はこの記事のすべての内容です。それがあなたを助けることができることを願っています。