1。スレッドの優先度
スレッドの優先順位の使用の例:
パッケージcn.galc.test; public class testthread6 {public static void main(string args []){mythread4 t4 = new mythread4(); mythread5 t5 = new mythread5();スレッドT1 =新しいスレッド(T4);スレッドT2 =新しいスレッド(T5); t1.setpriority(thread.norm_priority + 3); // setPriority()メソッドを使用してスレッドの優先度を設定します。ここで、T1スレッドの優先順位はSET/**通常の優先順位(Norm_priority)に基づいてレベル3でスレッドT1の優先順位を増やします。 t1.start(); t2.start(); System.out.println( "T1スレッドの優先度は次のとおりです。" + t1.getPriority()); // getPriority()メソッドを使用してスレッドの優先度を取得し、T1の優先度を8}} class mythRead4実装{public void run(){for(int i = 0; i <= 1000; i ++){system.out.println( "t1:"+i); }}} class mythread5を実装してrunnable {public void run(){for(int i = 0; i <= 1000; i ++){system.out.println( "===================================================================== }}} run()メソッドが終了するとすぐに、スレッドが終了します。2。スレッドの同期
同期されたキーワードの使用の例:
パッケージcn.galc.test; public class testsyncを実装してrunnable {Timer Timer = new Timer(); public static void main(string args []){testsync test = new testsync();スレッドT1 =新しいスレッド(テスト);スレッドT2 =新しいスレッド(テスト); t1.setName( "t1"); // t1スレッドの名前を設定します。t2.setname( "t2"); // t2スレッドの名前を設定しますt1.start(); t2.start(); } public void run(){timer.add(thread.currentthread()。getname()); }}クラスタイマー{private static int num = 0; public/ * synchronized */void add(string name){//メソッドを宣言するときに同期する場合、このメソッドの実行中に現在のオブジェクトがロックされていることを意味します。 1つのスレッドにアクセスする場合にのみ、 */ num ++にアクセスする次のスレッドの方向になります。 {thread.sleep(1); } catch(arturnedexception e){e.printstacktrace(); } system.out.println(name + ":あなたはタイマーを使用して" + num + "スレッドです"); }}}スレッドデッドロックの問題:
パッケージcn.galc.test;/*このアプレットは、スレッドデッドロックの問題をシミュレートします*/public class testdeadLock実装{public int flag = 1;静的オブジェクトo1 = new object()、o2 = new object(); public void run(){system.out.println(thread.currentthread()。getname() + "flag =" + flag); /**プログラムを実行した後、プログラムがそれを実行してフラグを印刷したことがわかりました。後続のIFステートメントを再び実行することはありません*プログラムはここで死んだことはありません。 } catch(arturnedexception e){e.printstacktrace(); }同期(O2){ /**オブジェクトO1は以前にロックされています。O2をロックできる限り、1*を印刷する操作を実行できます。ただし、オブジェクトO1は別のスレッドフラグにロックされているため、オブジェクトO2はここでロックできません。 }}}}} /**両方のステートメントがスレッドデッドロックの問題を引き起こしたために実行されない場合は両方ともデッドロックの問題を引き起こしていない場合*フラグ= 1このスレッドはオブジェクトO2のロックのロックを解除しています*およびフラグ= 0このスレッドはフラグを待っています= 1 flag = 0*/ if(flag == 0){synchronized(o2){/*ここでは、synchronizedを使用してオブジェクトo2 first*/ try {thread.sleep(500); } catch(arturnedexception e){e.printstacktrace(); }同期(O1){ / * *オブジェクトO2は以前にロックされています。 O1をロックできる限り、0を印刷する操作を実行できます。ただし、オブジェクトO1がフラグ= 1の別のスレッドにロックされているため、オブジェクトO1をここでロックすることはできません。オブジェクトO1をロックするスレッドは500ミリ秒ごとに睡眠をとることがありますが、睡眠時にO1をロックします*/ system.out.println( "0"); }}}} public static void main(string args []){testDeadLock td1 = new testDeadLock(); testDeadLock td2 = new testDeadLock(); td1.flag = 1; td2.flag = 0;スレッドT1 =新しいスレッド(TD1);スレッドT2 =新しいスレッド(TD2); t1.setName( "スレッドTD1"); t2.setName( "スレッドTD2"); t1.start(); t2.start(); }}スレッドが1つのオブジェクトのみをデッドロックするという問題を解決することが最善です。同時に2つのオブジェクトではありません。
プロデューサーと消費者の質問:
パッケージcn.galc.test;/*例名:プロデューサー - 消費者問題*ソースファイル名:producerconsumer.java*キーポイント:* 1。共有データの矛盾/重要なリソースの保護* 2。 stack = new syncstack(); Runnable P = new Producer(Stack); runnable c = new Consumer(stack);スレッドP1 =新しいスレッド(P);スレッドC1 =新しいスレッド(c); p1.start(); c1.start(); }} class syncstack {//マルチスレッド同期操作をサポートするスタックの実装プライベートインデックス= 0; private char [] data = new char [6]; public Synchronized void push(char c){if(index == data.length){try {this.wait(); } catch(arternedexception e){}} this.notify(); data [index] = c;インデックス++; } public synchronized char pop(){if(index == 0){try {this.wait(); } catch(arternedexception e){}} this.notify();索引 - ;データを返す[index]; }}クラスプロデューサーはrunnable {syncstack stack;パブリックプロデューサー(syncstack s){stack = s; } public void run(){for(int i = 0; i <20; i ++){char c =(char)(math.random()*26+'a'); stack.push(c); system.out.println( "生成:"+c); try {thread.sleep((int)(math.random()*1000)); } catch(arturtedexception e){}}}} class Consumer Implations runnable {syncstack stack; Public Consumer(syncstack s){stack = s; } public void run(){for(int i = 0; i <20; i ++){char c = stack.pop(); System.out.println( "Consumption:"+C); try {thread.sleep((int)(math.random()*1000)); } catch(arternedexception e){}}}}上記は、Javaスレッドの完全な紹介です。最初の記事「Javaはスレッド(1)を学び、学習しなければならない」を組み合わせて学習できます。