يتم استخدام اتصال الخيط لضمان تشغيل المواضيع المنسقة. بشكل عام ، يجب مراعاة اتصال الخيط عند القيام بمزامنة الخيط.
1. الاتصالات الخيط التقليدية
عادة ، يتم استخدام ثلاث طرق توفرها فئة ObjectLt:
يجب أن يطلق على هذه الطرق الثلاثة كائن شاشة التزامن وتنقسم إلى حالتين:
عند مزامنة الطرق ، نظرًا لأن شاشة التزامن تكون هذا الكائن ، يمكن استدعاء هذه الطرق الثلاثة مباشرة.
الأمثلة على النحو التالي:
الفئة العامة syncmethodthroadCommunication {static class datawrap {int data = 0 ؛ العلم المنطقي = خطأ ؛ Public Synchronised void addThreada () {if (flag) {try {wait () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} data ++ ؛ System.out.println (thread.currentThRead (). getName () + "" + data) ؛ العلم = صحيح ؛ إخطار () ؛ ) } catch (interruptedException e) {E.PrintStackTrace () ؛ }} data ++ ؛ System.out.println (thread.currentThRead (). getName () + "" + data) ؛ العلم = خطأ ؛ إخطار () ؛ }} static class threada يمتد مؤشر الترابط {بيانات datawrap الخاصة ؛ public threada (datawrap datawrap) {this.data = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {data.addthreada () ؛ }}} static class threadb يمتد مؤشر الترابط {بيانات datawrap الخاصة ؛ public threadb (datawrap datawrap) {this.data = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {data.addthreadb () ؛ }}} main static void static (string [] args) {// تنفيذ موضوعين لإضافة بيانات بدورها datawrap datawrap = datawrap جديد () ؛ new threada (datawrap) .start () ؛ threadb جديد (datawrap) .start () ؛ }}عند مزامنة كتل التعليمات البرمجية ، تحتاج إلى استخدام كائن الشاشة للاتصال بهذه الطرق الثلاثة.
الأمثلة على النحو التالي:
الفئة العامة SyncBlockThreadComminication {static class datawrap {boolean flag ؛ بيانات int ؛ } static class threada يمتد مؤشر ترابط {datawrap datawrap ؛ public threada (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {synchronized (datawrap) {if (datawrap.flag) {try {datawrap.wait () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} datawrap.data ++ ؛ System.out.println (getName () + "" + datawrap.data) ؛ datawrap.flag = true ؛ datawrap.notify () ؛ }}}}} static class threadb يمتد مؤشر ترابط {datawrap datawrap ؛ public threadb (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {synchronized (datawrap) {if (! datawrap.flag) {try {datawrap.wait () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} datawrap.data ++ ؛ System.out.println (getName () + "" + datawrap.data) ؛ datawrap.flag = false ؛ datawrap.notify () ؛ }}}} الفراغ الثابت العام (سلسلة [] args) {// تنفيذ موضوعين لإضافة بيانات بدورها datawrap datawrap = new datawrap () ؛ new threada (datawrap) .start () ؛ threadb جديد (datawrap) .start () ؛ }}2. استخدم الشرط للتحكم في اتصال الموضوع
عند استخدام كائن قفل لضمان التزامن ، يتم استخدام كائن شرط لضمان التنسيق.
الأمثلة على النحو التالي:
استيراد java.util.concurrent.locks.condition ؛ استيراد java.util.concurrent.locks.lock ؛ import java.util.concurrent.locks.reentrantlock ؛ import com.sun.media.sound.riffinvaliddataexception ؛ DataWrap {int data ؛ العلم المنطقي قفل قفل نهائي خاص = جديد reentrantlock () ؛ الشرط النهائي الخاص = lock.newcondition () ؛ public void addthreada () {lock.lock () ؛ جرب {if (flag) {try {inction.await () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} data ++ ؛ System.out.println (thread.currentThRead (). getName () + "" + data) ؛ العلم = صحيح ؛ حالة. } أخيرًا {lock.unlock () ؛ }} public void addThReadB () {lock.lock () ؛ جرب {if (! flag) {try {inction.await () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }} data ++ ؛ System.out.println (thread.currentThRead (). getName () + "" + data) ؛ العلم = خطأ ؛ حالة. } أخيرًا {lock.unlock () ؛ }}} static class threada تمتد مؤشر ترابط {datawrap datawrap ؛ public threada (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {datawrap.addthreada () ؛ }}} static class threadb يمتد مؤشر ترابط {datawrap datawrap ؛ public threadb (datawrap datawrap) {this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <10 ؛ i ++) {datawrap.addthreadb () ؛ }}} main static void static (string [] args) {// تنفيذ موضوعين لإضافة بيانات بدورها datawrap datawrap = datawrap جديد () ؛ new threada (datawrap) .start () ؛ threadb جديد (datawrap) .start () ؛ }}تتوافق AWAIT () و SINGAL () و SINGALALL () من كائن الشرط مع أساليب WAIT () ، وعلم () وإخطار () على التوالي.
3. استخدم حظر قائمة انتظار قائمة انتظار للتحكم في اتصال الخيط
Plockingqueue هو واجهة فرعية لواجهة قائمة الانتظار ، والتي تستخدم بشكل أساسي لاتصالات الخيط. إنه يحتوي على ميزة: عندما يحاول مؤشر ترابط المنتج وضع عنصر في blockingqueue ، إذا كانت قائمة الانتظار ممتلئة ، يتم حظر الخيط ؛ عندما يحاول مؤشر ترابط المستهلك إخراج العنصر من blockingqueue ، إذا كانت قائمة الانتظار فارغة ، يتم حظر الخيط. تتوافق هاتان الميزتان مع طريقتين يدعمان حظر ، وضع (e e) و take ()
الأمثلة على النحو التالي:
استيراد java.util.concurrent.arrayBlocking ؛ import java.util.concurrent.blockingqueue ؛ public leglockeueThreadComminication {static class datawrap {int data ؛ } static class threada يمتد thread {private blockingqueue <dataWrap> blockingqueue ؛ public threada (blockingqueue <DataWrap> blockingqueue ، اسم السلسلة) {super (name) ؛ this.blockingqueue = blockingqueue ؛ } Override public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {try {datawrap datawrap = blockingqueue.take () ؛ datawrap.data ++ ؛ System.out.println (getName () + "" + datawrap.data) ؛ النوم (1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}}}} static class threadb يمتد مؤشر الترابط {plockingqueue private <dataWrap> blockequeue ؛ DataWrap datawrap الخاص ؛ public threadb (blockingqueue <DataWrap> blockingqueue ، datawrap datawrap ، اسم السلسلة) {super (name) ؛ this.blockingqueue = blockingqueue ؛ this.datawrap = datawrap ؛ } Override public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {try {datawrap.data ++ ؛ System.out.println (getName () + "" + datawrap.data) ؛ blockingqueue.put (datawrap) ؛ النوم (1000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ }}}} public static void main (string [] args) {/// تنفيذ موضوعين لإضافة بيانات بدورها datawrap datawrap = new datawrap () ؛ blockingqueue <DataWrap> blockingqueue = new ArrayBlockingQueue <> (1) ؛ Threada جديد (blockingqueue ، "المستهلك"). start () ؛ threadb جديد (blockingqueue ، datawrap ، "منتج"). start () ؛ }}يحتوي Plockingqueue على خمسة فصول تنفيذ:
قائمة انتظار ArrayBlockingQueue Plockingqueue استنادًا إلى تنفيذ الصفيف
قائمة انتظار LinkedBlockingQueue Plockingqueue استنادًا إلى القائمة المرتبطة
تحتاج العناصر الموجودة في PriorityBlockingQueue إلى تنفيذ الواجهة المماثلة ، ويتم تخصيص ترتيب العناصر بواسطة المقارنة.
يزامن Synchronousqueue قائمة الانتظار ، مما يتطلب إجراء عمليات الوصول في قائمة الانتظار بالتناوب.
يجب أن تنفذ عناصر جمع التأخير واجهة التأخير ، ويتم فرز العناصر الموجودة في قائمة الانتظار وفقًا لقيمة إرجاع طريقة واجهة التأخير getDelay ().
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.