مؤشر ترابط خيط Java ، Runnable ، قابل للاتصال
تستخدم Java فئة مؤشرات الترابط لتمثيل مؤشرات الترابط ، ويجب أن تكون جميع كائنات الحقل مثيلات من فئة مؤشرات الترابط أو فئتها الفرعية. تتمثل وظيفة كل مؤشر ترابط في إكمال مهمة معينة ، والتي هي في الواقع لتنفيذ تدفق البرنامج. تستخدم Java هيئات تنفيذ مؤشرات الترابط لتمثيل تدفق البرنامج هذا.
1. ورث فئة الخيط لإنشاء مؤشر ترابط
الخطوات لبدء MultiThreading هي كما يلي:
(1) تحديد الفئة الفرعية لفئة الخيط وتجاوز طريقة التشغيل () للفئة. يمثل هيئة طريقة Run () المهام التي يحتاجها مؤشر ترابط الفئة إلى إكمالها. لذلك ، تسمى طريقة Run () هيئة تنفيذ مؤشر الترابط.
(2) إنشاء مثيل من الفئة الفرعية لخيط ، أي إنشاء كائن مؤشر ترابط.
(3) استدعاء طريقة Star () للاشتراك لبدء مؤشر الترابط.
الرموز ذات الصلة هي كما يلي:
/ *** يرث الفئة الداخلية من مؤشر ترابط لشراء التذاكر على سبيل المثال*/ الفئة العامة FirstThread يمتد Thread {private int i ؛ تذكرة int الخاصة = 10 ؛ Override public void run () {for (؛ i <20 ؛ i ++) {// عند الوراثة ، استخدم هذا مباشرة للحصول على مؤشر الترابط الحالي ، getName () احصل على اسم مؤشر الترابط الحالي // log.d (tag ، getName ()+""+i) ؛ if (this.ticket> 0) {log.e (tag ، getName () + "، بيع التذاكر: ticket =" + ticket--) ؛ }}}} private void starticketTreAd () {log.d (tag ، "starticketThread ،"+thread.currentThRead (). getName ()) ؛ FirstThread thread1 = new FirstThread () ؛ FirstThread thread2 = new FirstThread () ؛ FirstThread Thread3 = newThRead () ؛ thread1.start () ؛ thread2.start () ؛ thread3.start () ؛ // افتح 3 مؤشرات ترابط لشراء التذاكر ، بيع كل موضوع 10 تذاكر ، وما مجموعه 30 تذكرة}نتائج التشغيل:
يمكنك أن ترى أن متغيرات التصويت التي تم إدخالها بواسطة 3 مؤشرات ترابط غير مستمرة. ملاحظة: التذكرة هي خاصية مثيل لـ FirstThread ، وليس متغيرًا محليًا ، ولكن نظرًا لأن البرنامج يحتاج إلى إنشاء كائن FirstThread في كل مرة يقوم فيها بإنشاء كائن مؤشر ترابط ، فإن جميع مؤشرات الترابط المتعددة لا تشارك سمات المثيل.
2. قم بتنفيذ الواجهة القابلة للتشغيل لإنشاء مؤشرات الترابط
ملاحظة: سلاسل الفئة العامة تنفذ Runnable
(1) تحديد فئة التنفيذ للواجهة القابلة للتشغيل وتجاوز طريقة التشغيل () للواجهة. طريقة طريقة Run () هي أيضًا هيئة تنفيذ مؤشر الترابط للمعلومات.
(2) إنشاء مثيل لفئة مثيل Runnable. يتم استخدام هذا المثيل كهدف مؤشر ترابط لإنشاء كائن مؤشر ترابط. كائن الموضوع هو الكائن الحقيقي.
الرموز ذات الصلة هي كما يلي:
/ ** * قم بتنفيذ واجهة RunNable وإنشاء فئة مؤشر ترابط */ فئة عامة SecondThread تنفذ RunNable {private int i ؛ تذكرة int الخاصة = 100 ؛ Override public void run () {for (؛ i <20 ؛ i ++) {// إذا كانت فئة مؤشر الترابط تنفذ واجهة Runnable // الحصول على مؤشر الترابط الحالي ، يمكنك فقط استخدام Thread.currentThRead () للحصول على اسم مؤشر الترابط الحالي log.d (tag. if (this.ticket> 0) {log.e (tag ، thread.currentThread (). getName () + "، بيع التذاكر: ticket =" + ticket--) ؛ }}}} private void starticketthread2 () {log.d (tag ، "starticketthread2 ،"+thread.currentThRead (). getName ()) ؛ SecondThread SecondThread = new SecondThread () ؛ // قم بإنشاء موضوع جديد من خلال مؤشر ترابط جديد (الهدف ، الاسم) مؤشر ترابط جديد (SecondThread ، "Ticket Buyer 1"). Start () ؛ موضوع جديد (SecondThread ، "Ticket Buyer 2"). Start () ؛ موضوع جديد (SecondThread ، "Ticket Buyer 3"). Start () ؛ // على الرغم من فتح 3 مؤشرات ترابط ، تم شراء 100 تذكرة فقط في المجموع}نتائج التشغيل:
يمكنك أن ترى أن متغيرات التصويت التي تم إدخالها بواسطة 3 مؤشرات ترابط مستمرة ، ويمكن لمؤشرات الترابط المتعددة مشاركة خصائص مثيل فئة مؤشرات الترابط باستخدام الواجهة القابلة للتشغيل. هذا لأنه بهذه الطريقة ، فإن الكائن القابل للتشغيل الذي تم إنشاؤه بواسطة البرنامج هو مجرد هدف لخيط ، ويمكن أن تشارك مؤشرات الترابط المتعددة الهدف نفسه ، بحيث يمكن لمؤشرات الترابط المتعددة مشاركة خصائص المثيل لفئة مؤشر الترابط نفسها (والتي يجب أن تكون في الواقع فئة الهدف من مؤشر الترابط).
3. قم بإنشاء مؤشرات ترابط باستخدام قابلة للاتصال والمستقبل
بدءًا من Java 5 ، توفر Java واجهة قابلة للاتصال ، وهي نسخة محسّنة من Runnable. يوفر Callable فئة تسمى () طريقة يمكن استخدامها كهيئة تنفيذ مؤشر ترابط ، ولكن طريقة Call () أكثر قوة.
(1) يمكن أن تحتوي طريقة الاتصال () على قيمة إرجاع (2) يمكن أن تعلن طريقة الاتصال () استثناء
لذلك ، يمكننا توفير كائن قابل للاستدعاء كهدف مؤشر الترابط ، والمنفذ من مؤشر الترابط هو طريقة الاتصال () للكائن القابل للاتصال. في الوقت نفسه ، توفر Java 5 الواجهة المستقبلية لتمثيل قيمة الإرجاع لطريقة Call () في الواجهة القابلة للاتصال ، وتوفر فئة تنفيذ مستقبلات. تنفذ فئة التنفيذ هذه الواجهة المستقبلية وتنفذ الواجهة القابلة للتشغيل - الهدف الذي يمكن استخدامه كفئة مؤشر ترابط.
خطوات بدء التشغيل كما يلي:
(1) إنشاء فئة تنفيذ للواجهة القابلة للاتصال وتنفيذ طريقة الاتصال (). سيتم استخدام طريقة Call () كهيئة تنفيذ لخيط الخيط ، وتكون طريقة Call () قيمة إرجاع.
(2) إنشاء مثيل لفئة التنفيذ القابلة للاتصال واستخدم فئة FutureTask لالتفاف الكائن القابل للاتصال. يلف كائن مستقبل FutureTask قيمة إرجاع طريقة Call ().
(3) قم بإنشاء وبدء مؤشر ترابط جديد باستخدام كائن FutureTask كهدف لكائن مؤشر الترابط.
(4) استدعاء طريقة GET () لكائن مستقبلي للحصول على قيمة الإرجاع بعد تنفيذ مؤشر ترابط الطفل.
الرموز ذات الصلة هي كما يلي:
/ *** استخدم Callable لتنفيذ فئة مؤشرات الترابط*/ الفئة العامة ThirdThread تنفذ callable <integer> {private int ticket = 20 ؛ Override public integer call () {for (int i = 0 ؛ i <10 ؛ i ++) {// الحصول على مؤشر الترابط الحالي ، يمكنك فقط استخدام Thread.currentThread () للحصول على اسم مؤشر الترابط الحالي // log.d (tag ، thread.currentThread (). getName ()+"+i) ؛ if (this.ticket> 0) {log.e (tag ، thread.currentThread (). getName () + "، tickets: ticket =" + ticket--) ؛ }} تذكرة الإرجاع ؛ }} private void starcallablethread () {ThirdThread ThirdThread = new ThirdThread () ؛ FutureTask <integer> Task = New FutureTask <integer> (ThrugleThread) ؛ مؤشر ترابط جديد (المهمة ، "مؤشر الترابط مع قيمة الإرجاع"). ابدأ () ؛ حاول {integer integer = task.get () ؛ log.d (tag ، "starcallablethread ، قيمة الإرجاع لخيط الطفل ="+integer) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } catch (executionException e) {e.printStackTrace () ؛ }}نتائج التشغيل:
ملاحظة: تتيح طريقة Callable's Call () إعلانات لرمي الاستثناءات وتسمح بقيم الإرجاع.
يدعو البرنامج أخيرًا طريقة GET () لكائن مستقبل FutureTask لإرجاع قيمة الإرجاع لطريقة Call () ، مما تسبب في حظر مؤشر الترابط الرئيسي حتى تنتهي طريقة الاتصال ().
4. مقارنة ثلاث طرق
إنشاء متعدد الخيوط عن طريق وراثة فئة الخيط
العيوب: لا يمكن أن يتم مورث فئة الخيط من فئات الوالدين الأخرى.
المزايا: بسيطة للكتابة
قم بإنشاء متعدد الخيوط باستخدام طريقة الوراثة القابلة للتشغيل والقابلة للاتصال
العيوب: البرمجة معقدة بعض الشيء. إذا كنت بحاجة إلى الوصول إلى مؤشر الترابط الحالي ، فيجب عليك استخدام Thread.currentThread ()
المزايا:
(1) يمكن أيضًا أن ترث فئات أخرى (2) يمكن لمؤشرات الترابط المتعددة مشاركة كائن مستهدف ، لذلك فهي مناسبة جدًا لخيوط متعددة متطابقة للتعامل مع نفس المورد ، وبالتالي فصل وحدة المعالجة المركزية والرمز والبيانات لتشكيل نموذج واضح ، والذي يعكس بشكل أفضل الفكرة الموجهة للكائن للفئة.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!