لخصت منشورات المدونة السابقة بشكل أساسي بعض المحتوى في تزامن Java. يبدأ نشر المدونة هذا بشكل أساسي بمشكلة ومعرفة تقنيات التزامن المذكورة أعلاه يمكن استخدامها لحلها.
محاكاة سيناريو: معالجة 16 سجل سجل ، يستغرق كل وقت طباعة سجل سجل 1 ثانية. في ظل الظروف العادية ، في حالة الانتهاء من هذه السجلات الـ 16 ، يستغرق الأمر 16 ثانية. من أجل تحسين الكفاءة ، نحن على استعداد لبدء 4 مؤشرات ترابط للطباعة ، وطباعتها في 4 ثوان لتحقيق هذا العرض التوضيحي.
دعنا نحلل هذا السؤال أولاً. فيما يتعلق بسجلات السجل الـ 16 هذه ، يمكننا إنشاءها في الخيط الرئيسي. هذا ليس صعبًا. المفتاح هو بدء 4 مؤشرات ترابط للتنفيذ. هناك فكرتان الآن: إحداهما هي أن توليد السجلات والخيط الذي يطبع السجلات مفصولة منطقيا ؛ والآخر هو أن توليد السجلات والخيط الذي يطبع السجلات غير منفصلة من الناحية المنطقية. قد يكون هذا غامضا بعض الشيء. اسمحوا لي أن أكتب عرضًا تجريبيًا تم تنفيذه بناءً على هاتين الفكرتين.
توليد السجل وطباعة السجل منفصلة منطقيا.
هذا يعادل جبهتين: إحدى الجبهة يتم توليد سجلات باستمرار ، والجبهة الأخرى هي طباعة السجلات باستمرار. من الواضح أنك ستفكر في استخدام قوائم انتظار حظر ، وإنشاء سجلات تستمر في توصيل قوائم انتظار الحظر ، وسجلات الطباعة التي تستمر في الانتقال من قوائم انتظار الحظر. يمكن تعيين حجم قائمة انتظار الحظر بنفسك ، 16 أو 1 ، والتي لا تؤثر على التنفيذ. لذلك سيتم استخدام blockingqueue ، دعنا نلقي نظرة على العرض التوضيحي المنفذ أدناه:
Public Class Practice1 {public static void main (string [] args) {// تحديد قائمة انتظار الحظر ، يمكن أن يحتوي حجم قائمة الانتظار على 16 معلومات عن معلومات <String> Queue = new ArrayBlockingQueue <string> (16) ؛ لـ int i = 0 ؛ i <4 ؛ i ++) {بينما (true) {try {string log = queue.take () ؛ // get log parselog (log) ؛ // print log} catch (interruptedException e) {// todo catch catch blocke.printstacktrace ( + endrict. (System.CurrentTimeMillis ()/1000))) ؛ لـ (int i = 0 ؛ i <16 ؛ i ++) {Final String log = "" +(i +1) ؛ // اذكر السجل TRAY {queue.put (log) ؛ blocke.printStackTrace () ؛}}} parselog static parselog (سجل السلسلة) {// طريقة طباعة نظام السجل. Second} catch (InterruptedException e) {// todo catch blocke.printstacktrace () ؛}}} يشبه هذا النظام الذي يعمل ، وإنشاء سجلات باستمرار وفتح مؤشرات ترابط متعددة باستمرار لطباعة معلومات السجل. تم كتابة العرض التوضيحي ولم يتم نشر نتيجة العملية.
توليد السجل والطباعة السجل ليست منفصلة منطقيا.
هذه الفكرة هي أنه عندما أقوم بإنشاء السجل ، يمكنك طباعته من أجلي وتفعل ذلك مع أربعة مؤشرات ترابط معًا! لذلك إذا كنت تفكر بهذه الطريقة ، فيجب عليك استخدام تجمع الخيوط. قمت أولاً بإنشاء تجمع مؤشرات ترابط ، والذي يحتوي على 4 مؤشرات ترابط ، وبعد ذلك عندما تم إنشاء السجل ، طلبت من تجمع مؤشرات الترابط استخدام مؤشر الترابط لتنفيذه. العرض التوضيحي كما يلي:
Public Class Practice1 {public static void main (string [] args) {executorService service = Executors.NewFixedThreadPool (4) ؛ // إنشاء نظام تجمع مؤشر ترابط. service.execute (new RunNable () {// خذ مؤشر ترابط لتنفيذ Override public void run () {parselog (log) ؛}}) ؛} service.shutdown () ؛ // لا تنسى إيقاف تشغيل مجموعة مؤشرات الترابط في النهاية} "---" + (System.CurrentTimeMillis ()/1000)) ؛ جرب {thread.sleep (1000) ؛ // طباعة السجل يأخذ 1 ثانية} catch (interruptedexception e) {// todo acto catch.دعنا نلخص هذه المشكلة هنا. إذا فهمت هاتين الفكرتين ، فيمكنك حلها بشكل فعال.
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة حول برمجة Java برمجية مثال للمشكلة متعددة الخيوط ، وآمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!