スレッドコンセッション:lied()
利回り()の目的は、屈服することです。現在のスレッドが「ランニング状態」から「準備ができた状態」を入力できるようにし、同じ優先順位を持つ他の待機スレッドが実行権を取得できるようにすることができます。ただし、現在のスレッドがried()を呼び出した後、同じ優先度のある他のスレッドが実行権を確実に取得することを保証することはできません。また、現在のスレッドが「実行中の状態」に入り、実行を続けている可能性があります!
例:
class threadaはthreadを拡張します{public threada(string name){super(name); } public synchronized void run(){for(int i = 0; i <10; i ++){system.out.printf( "%s [%d]:%d/n"、this.getName()、this.getPriority()、i); //私が4で分割されたら、if(i%4 == 0)thread.yield()を呼び出します。 }}} public class evelstest {public static void main(string [] args){threada t1 = new swerch( "t1"); threada t2 = new Streada( "T2"); t1.start(); t2.start(); }} (一度)操作結果:
T1 [5]:0T2 [5]:0T1 [5]:1T1 [5]:2T1 [5]:3T1 [5]:4T1 [5]:5T1 [5]:6T1 [5]:7T1 [5]:8T1 [5]:9T2 [5]:1T2 [5]:2T2 [5]:3t2 [5]:4T2 [5]: [5]:6T2 [5]:7T2 [5]:8T2 [5]:9
結果説明:
「スレッドT1」を4で統合できる場合、「Thread T2」に切り替えません。これは、evel()が「ランニング状態」から「Ready State」にスレッドを入力できるようにすることができるが、他のスレッドがCPUの実行権を取得できるとは限らないことを示しています(つまり、他のスレッドが「実行状態」に入ります)。
収量()とwait()の比較:
wait()の関数は、現在のスレッドが「wait(blocking)from "from" synchronization lockをリリースすることを許可することであることがわかっています。IVERVER()の関数は、現在のスレッドが「実行状態」を離れることになります。違いは次のとおりです。
(1)wait()は、スレッドが「running状態」から「wait(blocking)状態」を入力させることです。
(2)wait()は、保持されるオブジェクトをスレッドする一方、evel()メソッドはロックを放出しない同期ロックです。
次の例は、evel()がロックを放出しないことを示しています。
public class hiredlocktest {private static object obj = new object(); public static void main(string [] args){threada t1 = new threada( "t1"); threada t2 = new Streada( "T2"); t1.start(); t2.start(); } static class threada extends thread {public threada(string name){super(name); } public void run(){// get synchronized(obj){for(int i = 0; i <10; i ++){system.out.printf( "%s [%d]:%d/n"、this.getName()、this.getPriority()、i); //私が4で分割されたら、if(i%4 == 0)thread.yield()を呼び出します。 }}}}}} (一度)結果:
T1 [5]:0T1 [5]:1T1 [5]:2T1 [5]:3T1 [5]:4T1 [5]:5T1 [5]:6T1 [5]:7T1 [5]:8T1 [5]:9T2 [5]:0T2 [5]:1T2 [5]:2T2 [5]:3T2 [5]:4T2 [5]: [5]:6T2 [5]:7T2 [5]:8T2 [5]:9
結果説明:
2つのスレッドT1とT2がメインスレッドメインで開始されます。 T1とT2は、run()、つまり同期(OBJ)の同じオブジェクトの同期ロックを参照します。 T1操作中に、swerch.yield()を呼び出します。 T2はCPUの実行権を取得しません。 T1は「OBJが保持している同期ロック」をリリースしないためです!
スレッドスリープ:スリープ()
sleep()はthread.javaで定義されています。
Sleep()の機能は、現在のスレッドを睡眠にすることです。つまり、現在のスレッドは「ランニング状態」から「睡眠(ブロッキング)状態」に入ります。 Sleep()は睡眠時間を指定し、スレッドの睡眠時間は睡眠時間よりも大きくなります。スレッドが再び目覚めると、「ブロッキング状態」から「準備ができた状態」に変わり、CPUが実行されるのを待っています。
例:
class threadaはthreadを拡張します{public threada(string name){super(name); } public synchronized void run(){try {for(int i = 0; i <10; i ++){system.out.printf( "%s:%d/n"、this.getName()、i); // 4で分割できる場合、100msでスリープします(i%4 == 0)thread.sleep(100); }} catch(arturnedexception e){e.printstacktrace(); }}} public class sleeptest {public static void main(string [] args){threada t1 = new swerch( "t1"); t1.start(); }}実行結果:
T1:0T1:1T1:2T1:3T1:4T1:5T1:6T1:7T1:8T1:9
結果説明:
プログラムは比較的簡単です。メインスレッドメインのスレッドT1を開始します。 T1が開始された後、T1の計算Iが4で割り切れることができる場合、T1はthread.sleep(100)を介して100ミリ秒間眠ります。
睡眠()とwait()の比較:
wait()の関数は、現在のスレッドが「wait(blocking)状態から「実行状態」から入力し、同期ロックをリリースできるようにすることであることがわかります。睡眠()の関数は、現在のスレッドが「ランニング状態」から「睡眠(ブロッキング)状態」に入ることです。
ただし、wait()はオブジェクトの同期ロックを解放しますが、sleep()はロックを放出しません。
次の例は、Sleep()がロックを放出しないことを示しています。
public class sleeplocktest {private static object obj = new object(); public static void main(string [] args){threada t1 = new threada( "t1"); threada t2 = new Streada( "T2"); t1.start(); t2.start(); } static class threada extends thread {public threada(string name){super(name); } public void run(){// objオブジェクトの同期ロックを取得しますsynchronized(obj){for(int i = 0; i <10; i ++){system.out.printf( "%s:%d/n"、this.getname()、i); // 4で分割できる場合、100msでスリープします(i%4 == 0)thread.sleep(100); }} catch(arturnedexception e){e.printstacktrace(); }}}}}}}}}}実行結果:
T1:0T1:1T1:2T1:3T1:4T1:5T1:6T1:7T1:8T1:9T2:0T2:1T2:2T2:3T2:4T2:5T2:6T2:7T2:8T2:9
結果説明:
2つのスレッドT1とT2がメインスレッドメインで開始されます。 T1とT2は、run()、つまり同期(OBJ)の同じオブジェクトの同期ロックを参照します。 T1ランニング中、スレッドを呼び出しますが、睡眠(100)。 T2はCPUの実行権を取得しません。 T1は「OBJが保持している同期ロック」をリリースしないためです!
同期(OBJ)をコメントしてプログラムを再度実行すると、T1とT2を互いに切り替えることができることに注意してください。コメントチューンが同期した後のソースコード(OBJ)は次のとおりです。
public class sleeplocktest {private static object obj = new object(); public static void main(string [] args){threada t1 = new threada( "t1"); threada t2 = new Streada( "T2"); t1.start(); t2.start(); } static class threada extends thread {public threada(string name){super(name); } public void run(){// objオブジェクトの同期ロックを取得// synchronized(obj){for(int i = 0; i <10; i ++){system.out.printf( "%s:%d/n"、this.getname()、i); // 4で分割できる場合、100msでスリープします(i%4 == 0)thread.sleep(100); }} catch(arturnedexception e){e.printstacktrace(); } //}}}}