2つのスレッドが同時に実行され、1つのスレッドで実行されるコードには次のようなデッドループが含まれているとします。
サンプルコード(コードはインターネットに由来します)
パブリッククラスサービス{object object1 = new object(); public void methoda(){synchronized(object1){system.out.println( "methoda begin"); boolean iscontinuerun = true; //ここでデッドループを実行します(iscontinuerun){} system.out.println( "methoda end"); }} object object2 = new object(); public void methodb(){synchronized(object2){system.out.println( "methodb begin"); system.out.println( "methodb end"); }}} 2つのスレッドクラスの実装は次のとおりです。
Import service.service;パブリッククラスのスレッドはスレッド{プライベートサービスサービス; public threada(service service){super(); this.service = service; } @Override public void run(){service.methoda(); }}スレッドaはmethoda()を実行し、methoda()にデッドループがあります
Import service.service; public class threadb拡張スレッド{プライベートサービスサービス; public threadb(service service){super(); this.service = service; } @Override public void run(){service.methodb(); }}スレッドBはmethodb()を実行します。 Thread AがMethoda()でWhile Deadループに入ると、スレッドBは実行して完了できますか?
テストクラス
Import service.service; Import extthread.threada; Import extthread.threadb; public class run {public static void main(string [] args){service service = new Service(); threada athread = new swercha(service); athread.start(); threadb bthread = new shoodb(service); bthread.start(); }}スレッドAとスレッドBで取得されたオブジェクトロックは同じロックではないため、結果からスレッドBを実行および完了することができます。スレッドAはDead Loopに入るため、スレッドAは実行を続けて実行し続けます(プログラム全体が終了していません)が、スレッドBは終了します。
つまり、スレッドAは常に実行中に実行されますが、CPUを取り上げる必要があります。ただし、スレッドスケジューリングはJVMまたはオペレーティングシステムの責任です。スレッドAが常にループしていることを意味するものではなく、スレッドBがCPUを占有しないことを意味します。スレッドAの場合、それは「計算集約型」ジョブと同等です。 whileループが特定の条件が真であるかどうかを継続的にテストする場合、この方法はCPUの無駄です。特定の例を参照できます:ポーリング中の「スレッド間通信メソッド」2番目のポイントのJavaマルチスレッドJavaポイントのスレッド間の通信方法の「スレッド間通信方法」。
service.javaが次のように変更されている場合:
パブリッククラスサービス{// object object1 = new object(); public void methoda(){synchronized(this){system.out.println( "methoda begin"); boolean iscontinuerun = true; //ここでデッドループを実行します(iscontinuerun){} system.out.println( "methoda end"); }} // object object2 = new object(); public void methodb(){synchronized(this){system.out.println( "methodb begin"); system.out.println( "methodb end"); }}}スレッドAが最初にオブジェクトロックを取得する場合、スレッドAは常にwhileループのためにwhileループになります。スレッドBは、ロックを取得できないため、methodb()を実行できません。
1つのスレッドが同期されたメソッドで終了できず、ロックをリリースできない場合、もう1つのスレッドは無限に待つことができることがわかります。
上記はこの記事に関するすべてです。 Java Multithreadingを学ぶことは誰にとっても役立つことを願っています。