1. أولوية المواضيع
أمثلة على استخدام أولوية الخيط:
حزمة cn.galc.test ؛ فئة عامة testTreThread6 {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/** t1.start () ؛ t2.start () ؛ System.out.println ("أولوية T1 Thread هي:" + t1.getPriority ()) ؛ // استخدم طريقة getPriority () للحصول على أولوية مؤشر الترابط وطباعة أولوية T1 لتكون 8}} class myThread4 تنفذ Runnable {public void run () {for (int i = 0 ؛ i <= 1000 ؛ i ++) {system.out.println ("t1:"+i) ؛ } }}class MyThread5 implements Runnable { public void run() { for (int i = 0; i <= 1000; i++) { System.out.println("=================== T2:" + i); }}} بمجرد انتهاء طريقة Run () ، ينتهي مؤشر الترابط.2. تزامن الموضوع
أمثلة على استخدام الكلمات الرئيسية المتزامنة:
Package cn.galc.test ؛ فئة public testsync تنفذ runnable {timer timer = new timer () ؛ الفراغ الثابت العام (سلسلة args []) {testSync test = new testsync () ؛ الموضوع T1 = موضوع جديد (اختبار) ؛ الموضوع T2 = موضوع جديد (اختبار) ؛ T1.setName ("T1") ؛ // قم بتعيين اسم مؤشر ترابط T1 T2.setName ("T2") ؛ // اضبط اسم T2 Thread T1.start () ؛ t2.start () ؛ } public void run () {timer.add (thread.currentThread (). getName ()) ؛ }} timer {private static int num = 0 ؛ public/ * Synchronized */void add (اسم السلسلة) {// عند إضافة متزامن عند إعلان طريقة ما ، فهذا يعني أن الكائن الحالي مغلق أثناء تنفيذ هذه الطريقة متزامنة (هذا) {/ * * * استخدام متزامن (هذا) لقفل الكائن الحالي ، بحيث لا يكون هناك مشكلة في خيطين مختلفين في توصيل مصدر الكائن نفسه في الوقت نفسه. فقط عند الوصول إلى مؤشر ترابط واحد سيكون دور مؤشر الترابط التالي للوصول إلى */ num ++ ؛ حاول {thread.sleep (1) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } system.out.println (name + ": أنت" + num + "مؤشرات الترابط باستخدام Timer") ؛ }}} مشكلة مسدود الموضوع:
حزمة cn.galc.test ؛/*يحاكي هذا التطبيق مشكلة ديدلوك مؤشر ترابط*/الفئة العامة testDeadlock تنفذ Runnable {public int flag = 1 ؛ كائن ثابت O1 = جديد كائن () ، O2 = كائن جديد () ؛ public void run () {system.out.println (thread.currentThread (). getName () + "flag =" + flag) ؛ /** بعد تشغيل البرنامج ، وجدت أن البرنامج قد نفذه وطبع العلم ، ولن أقوم أبدًا بتنفيذ العبارة اللاحقة مرة أخرى* توفي البرنامج هنا ، ولا تنفيذ أو خروج*/* هذا هو علامة الخيوط = 1*// if (thar == 1) } catch (interruptedException e) {E.PrintStackTrace () ؛ } تم قفل (O2) { /**** الكائن O1 من قبل ، طالما أنه يمكن قفل O2 ، يمكنك تنفيذ تشغيل طباعة 1* ومع ذلك ، لا يمكن قفل الكائن O2 هنا ، لأن الكائن O1 قد تم قفله في علم موضوع آخر = 0* }}} ستر flag = 0*/ if (flag == 0) {synchronized (o2) {/*هنا نستخدم متزامن لقفل O2 أولاً*/ try {thread.sleep (500) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } synchronized (O1) { / * * الكائن O2 تم قفله من قبل. طالما أنه يمكن قفل O1 ، يمكن تنفيذ عملية الطباعة 0. ومع ذلك ، لا يمكن قفل الكائن O1 هنا ، لأنه تم قفل الكائن O1 في مؤشر ترابط آخر من العلم = 1. على الرغم من أن الخيط الذي يغلق الكائن O1 سينام كل 500 مللي ثانية ، إلا أنه لا يزال يغلق O1 عند النوم*/ system.out.println ("0") ؛ }}}} main static void static (سلسلة args []) {testDeadlock td1 = new testDeadlock () ؛ testDeadlock TD2 = جديد testDeadlock () ؛ td1.flag = 1 ؛ td2.flag = 0 ؛ الموضوع T1 = مؤشر ترابط جديد (TD1) ؛ الموضوع T2 = مؤشر ترابط جديد (TD2) ؛ T1.setName ("Thread TD1") ؛ t2.setName ("Thread TD2") ؛ t1.start () ؛ t2.start () ؛ }}من الأفضل حل مشكلة كائن واحد فقط ، وليس كائن واحد في نفس الوقت.
أسئلة المنتج والمستهلك:
حزمة cn.galc.test ؛/* مثال الاسم: المنتج-مستهلك المشكلة* اسم الملف الاسم: producersumer.java* النقاط الرئيسية:* 1. syncstack () ؛ Runnable p = منتج جديد (stack) ؛ Runnable C = مستهلك جديد (مكدس) ؛ الموضوع P1 = موضوع جديد (ع) ؛ الموضوع C1 = موضوع جديد (C) ؛ p1.start () ؛ c1.start () ؛ }} class syncstack {// تنفيذ المكدس التي تدعم عمليات التزامن المتعددة مؤشرات int index = 0 ؛ char private [] data = new Char [6] ؛ push push void المزامنة العامة (char c) {if (index == data.length) {try {this.wait () ؛ } catch (interruptedException e) {}} this.notify () ؛ البيانات [الفهرس] = ج ؛ فهرس ++ ؛ } synchronized char pop () {if (index == 0) {try {this.wait () ؛ } catch (interruptedException e) {}} this.notify () ؛ فِهرِس--؛ إرجاع بيانات [الفهرس] ؛ }} يقوم منتج الفئة بتنفيذ 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) ؛ حاول {thread.sleep ((int) (Math.Random ()*1000)) ؛ } catch (interruptedException e) {}}}} فئة المستهلك تنفس Runnable {syncstack stack ؛ المستهلك العام (syncstack s) {stack = s ؛ } public void run () {for (int i = 0 ؛ i <20 ؛ i ++) {char c = stack.pop () ؛ System.out.println ("الاستهلاك:"+C) ؛ حاول {thread.sleep ((int) (Math.Random ()*1000)) ؛ } catch (InterruptedException e) {}}}}ما سبق هو المقدمة الكاملة لخيوط جافا. يمكنك الجمع بين المقالة الأولى "Java يجب أن تتعلم وتعلم المواضيع (1)" للتعلم ، على أمل أن تساعدك.