أولئك الذين قرأوا مقالاتي السابقة قد يعرفون أنني أقوم بتطوير اللعبة. تتم معالجة العديد من أفكاري ونقاط البداية وفقًا لأفكار اللعبة ، لذلك قد يكون هناك تعارض مع الويب ولا تتماشى معها.
دعني أخبرك لماذا أريد تخصيص نموذج الموضوع؟
وفقًا للعبة MMORPG أو MMORPG التي قمت بها ، يتم تقسيم مؤشرات الترابط إلى مؤشر ترابط رئيسي ، وخيط المزامنة العالمية ، وموضوع الدردشة ، وخيط الفريق ، وموضوع الخريطة ، وتوزيع رسائل الخريطة وخيط التسليم ، إلخ.
يجب التحكم في بعض الأعمدة وفقًا لقسمتي وتدفق البيانات.
الشيء الرئيسي الذي يجب القيام به في خادم اللعبة هو قبول طلب أمر المشغل -> العملية المقابلة -> إرجاع النتيجة ؛
سيتم تسجيل جميع الرسائل الموجودة على جانب الخادم في مدير الرسائل ، ثم سيتم تحديد نموذج مؤشر الترابط عند تسجيل الرسالة.
إذا كانت الرسالة تحتاج إلى إرسال إلى مؤشر ترابط خريطة المشغل للمعالجة ، عند تسجيل الرسالة ، فيجب عليك استخدام نموذج مؤشر الترابط (توزيع رسائل MAP ورسالة مؤشر ترابط) ؛
دعنا نحلل نموذج الخيط أولاً ؛
قبل النظر إلى رمز نموذج الموضوع ، أنظر أولاً إلى نموذج مهمتي
package net.sz.engine.thread ؛ استيراد java.io.serializable ؛ استيراد org.apache.log4j.logger ؛ استيراد net.sz.engine.structs.objectattribut 13882122019 <br> */Public Abstract Class Taskevent تنفذ مسلسلًا ، قابل للاستنساخ {private Static Final Logger = logger.getLogger (taskevent.class) ؛ استاتيكي خاص نهائي الطويل المسلسل = 4196020659994845804L ؛ // بيانات وقت التشغيل الخاص عابرة عابرة ObjectAttribute Runother = new ObjectAttribute ؛ // وقت إنشاء المهمة المحمي الطويل. // Task Task id id educed taskid ؛ // إلغاء المهمة المحمية المنطقية الإلغاء = خطأ ؛ public taskevent {this.runother.put ("submittime" ، system.currentTimeMillis) ؛ createTime = System.CurrentTimeMillis ؛ إلغاء = خطأ ؛ TaskId = ObjectGlobal.getuuid ؛ } public getCreateTime {return createTime ؛ } public void setCreateTime (long createTime) {this.createTime = createTime ؛ } public long getSubmittime {return this.runother.getLongValue ("submittime") ؛ } objectAttribute getRunother {return runother ؛ } iscancel boolean العامة {return cancel ؛ } public void setCancel (Boolean Cancel) {this.cancel = cancel ؛ } المجرى التجريدي التجريدي. Override الكائنات العامة استنساخ يلقي clonenotsupportedException {return super.clone ؛ // لتغيير مجموعة الأساليب التي تم إنشاؤها ، اختر الأدوات | قوالب. }}حزمة net.sz.engine.thread ؛/** * Timer Executor * * <br> * فاشل المؤلف المبرمج <br> * البريد [email protected] <br> * الهاتف 13882122019 <Br> */public stortment classevent timertasevent taskevent / *** حان الوقت لبدء التنفيذ*/ محمية طويلة وقت البدء ؛ / *** ما إذا كان يجب تنفيذها مرة واحدة في البداية*/ بدء التشغيل المنطقي المحمي ؛ / *** وقت الانتهاء*/ محمي طويل النهايات ؛ / *** عدد عمليات الإعدام*/ محمية int ActionCount ؛ / *** وقت التنفيذ الفاصل*/ محمي int intertime ؛ / ***** param startTime حدد وقت البدء* param isStartAction ما إذا كان سيتم التنفيذ مرة واحدة في البداية* param endtime حدد وقت الانتهاء* param actioncount حدد عدد عمليات الإعدام* param intertime حدد الوقت الفاصل*/ public timertaskevent (start start ، boolean isStartAction ، long endtate ، int int int this.startTime = وقت البدء ؛ this.startAction = isStartAction ؛ this.endtime = endtime ؛ this.ActionCount = ActionCount ؛ this.Intervaltime = الفاصل الزمني ؛ } / *** حدد وقت تنفيذ البدء للمهمة** param startTime حدد وقت البدء* param isStartAction ما إذا كان قد تم تنفيذه مرة واحدة في البداية* param actioncount حدد عدد عمليات الإعدام* @param attime ، int intertime ، int intertime ، ent intertime ، ent int (int ( ActionCount ، الفاصل الزمني) ؛ } / *** وقت الانتهاء المحدد هو وقت النهاية ، وعدد عمليات الإعدام ليس بالضرورة كافيًا** @param isStartAction ما إذا كان يجب تنفيذه مرة واحدة في البداية* param endtime حدد وقت الانتهاء* param actioncount حدد عدد عمليات الإعدام* @param intertime ، تحديد الوقت الفاصل* هذا (0 ، isStartAction ، endtime ، actioncount ، stereattime) ؛ } / *** حدد وقت البدء ووقت الانتهاء** param startime حدد وقت البدء* param endtime حدد وقت الانتهاء* param intertime حدد الفاصل الزمني* / timertaskevent العام (وقت بدء طويل ، نهاية طويلة ، int stertaltim } / *** أوقات التنفيذ المحددة ووقت الفاصل الزمني** param ActionCount حدد عدد عمليات الإعدام* param stertimtime حدد وقت الفاصل* / timertaskevent العامة (int ActionCount ، int steraltime) {this (0 ، false ، 0 ، actioncount ، intertimtime) ؛ } / *** تنفيذ غير محدود بعد التقديم* param الفاصل الزمني المحدد وقت الفاصل* / public timertaskevent (int intertaltime) {this (0 ، false ، 0 ، -1 ، vertimtime) ؛ } Public GetStartTime {return startTime ؛ } public void setStartTime (وقت بدء طويل) {this.startTime = StartTime ؛ } boolean public isStartAction {return startAction ؛ } public void setStartAction (boolean startAction) {this.startAction = startAction ؛ } public long getendtime {return endtime ؛ } public void setendtime (endtime long) {this.endtime = Endtime ؛ } public int getActionCount {return ActionCount ؛ } public void setActionCount (int ActionCount) {this.actionCount = ActionCount ؛ } public int getIntervaltime {return vertaltime ؛ } public void setInterValtime (int intertaltime) {this.IntervalTime = intertaltime ؛ }}
فيما يلي نموذج المهمة ونموذج مهمة المؤقت ؛
package net.sz.engine.thread ؛ import java.util.arraylist ؛ import java.util.list ؛ import java.util.concurrent.concurrentLinkedqueue ؛ org.apache.log4j.logger ؛ استيراد org.jboss.jandex.main ؛/** * نموذج الموضوع * <br> * فاشل المؤلف المبرمج <br> * البريد [email protected] <br> * phone 13882122019 <br> logger.getLogger (threadmodel.class) ؛ private static threadid = 0 ؛ كائن نهائي ثابت محمي syn_object = كائن جديد ؛ محمي طويل. اسم السلسلة المحمية ؛ محمي طويل LastsendMail = 0 ؛ محمي ArrayList <Morthread> Threads = new ArrayList <> ؛ /*** قائمة المهام قائمة المهام SAFE-SAFE*/// القائمة النهائية المحمية <TaskModel> TaskQueue = جديد ArrayList <> ؛ concurrentLinkedqueue النهائي المحمي <TasKevent> taskqueue = concurrentLinkedqueue <> ؛ / ***/ القائمة النهائية المحمية <TimerTasKevent> timerqueue = new ArrayList <> ؛ . Public ThreadModel (ThreadGroup Group) {this (Group ، "no name" ، 1) ؛ } public threadmodel (اسم السلسلة) {this (threadpool.unknownthreadgroup ، name ، 1) ؛ } public threadmodel (مجموعة threadgroup ، اسم السلسلة ، int threadcount) {this (group ، name ، threadcount ، null) ؛ } public threadmodel (مجموعة threadgroup ، اسم السلسلة ، int threadcount ، Runnable Runnable) {synchronized (syn_object) {threadid ++ ؛ tid = threadid ؛ } لـ (int i = 1 ؛ i <= threadcount ؛ i ++) {mythread thread ؛ if (runnable == null) {thread = new myThread (tid ، group ، this ، name + "-" + tid + "-" + i) ؛} آخر {thread = new mythread (tid ، group ، runnable ، name + "-tid +"-" + i) ؛ } thread.start ؛ threads.add (thread) ؛ } this.name = name ؛ } / ** * name thread * * return * / public string getName {return name ؛ } / ** * احصل على المعرف المخصص للمعرف * * regurn * / public getid {return this.tid ؛ } / ** * إضافة مهمة جديدة لكل مهمة جديدة ، يجب إيقاظ قائمة انتظار المهمة * * param runnable * / public void addTask (taskevent runnable) {taskqueue.add (runnable) ؛ Synchronized (taskqueue) {/ * استيقظ في قائمة الانتظار وابدأ في تنفيذ */ taskqueue.notifyall ؛ }}/** * أضف مهمة مؤقت إلى مؤشر الترابط * * param runnable */public void addtimer (timertaskevent runnable) {synchronized (timerqueue) {if (runing) {// تنفيذ مرة واحدة في البداية if (runnable.startAction) {addTask (runnable) ؛ } timerqueue.add (runnable) ؛} آخر {log.error ("توقف مؤشر الترابط") ؛ }}}} // <Editor-Fold DefaultState = "Glapsed" desc = "Timer Thread Executor public void timerrun"> / *** Timer Thread Executor* / public void timerrun {ArrayList <TimertAskevent> TaskModels ؛ Synchronized (timerqueue) {// إذا لم تكن قائمة الانتظار فارغة ، فقم بإخراج TaskModels Timer Timer = new ArrayList <> (timerqueue) ؛ } if (! taskModels.isempty) {for (timertaskevent timerevent: taskModels) {int execcount = timerevent.getRunother.getTinvalue ("execcount") ؛ Long last time = timerevent.getRunother.getLongValue ("lastExectime") ؛ long nowtime = system.currentTimeMillis ؛ if (last time == 0) {timerevent.getRunother.put ("lastExectime" ، nowtime) ؛} آخر if (timerevent.iscancel) {// إذا تم إلغاء المهمة (timerqueue) } log.debug ("قم بتنظيف مهمة المؤقت:" + timerevent.getClass.getName) ؛} آخر إذا (nowtime> timerevent.getStartTime // ما إذا كان وقت البدء راضيًا عن وقت الفاصل && (nowtime - timerevent.getsubmittime> timerevent.getintervaltime) // ما إذا كان الوقت الفاصل راضياً عن التوتر &&&&&& timerevent.getendtime) // حدد وقت الانتهاء && (nowtime - last time> = timerevent.getIntervaltime)) // execcount) ؛ timerevent.getRunother.put ("lastExectime" ، nowtime) ؛ nowtime = system.currentTimeMillis ؛ // تحديد حالة الحذف إذا (timerevent.getendtime> 0 && nowtime <timerevent.getendtime) || timerqueue.remove (timerevent) ؛ } log.debug ("Cleaning Timer Task:" + timerevent.getClass.getName) ؛ }}}}}}} // </editor-fold> // <editor-fold defaultState = "Glapsed" desc = "عرض سلسلة رسائل العرض العامة showstacktrace">/**** عرض ترابط الخيط*/public void showstacktrace {StringBuilder buf = new StringBuilder ؛ لـ (myThread CurrentThread: Threads) {long procc = system.currentTimEmillis - currentThread.getLastExecuteTime ؛ if (procc> 5 * 1000 && procc <86400000l) {// أقل من 10 أيام // لأن وقت العملية المتعددة قد يكون غير دقيق ( عالقة-> ") .append (procc/1000f) .append (" s/n ") .append (" تنفيذ المهمة: ") .append (currentThread.getLastCommand.getClass.getName) ؛ try {stacktraceElement elements = currentThread.getStackTrace ؛ for (int i = 0 ؛ . }} catch (استثناء e) {buf.append (e) ؛ } buf.append ("/n +++++++++++++++++++++++++++++++++") ؛ }} String toString = buf.ToString ؛ if (! stringUtil.isnullorEmpty (toString)) {log.error (toString) ؛ if (system.currentTimeMillis-lastsendmail> 5 * 60 * 1000) ObjectGlobal.platform + "Server ID-" + ObjectGlobal.Serverid ، toString) ؛ }}} // </editor-fold> Override public void Run {myThread currentThread = (mythread) thread.currentThread ؛ بينما (Runing) {بينما (taskqueue.isempty && running) {try {/* قائمة انتظار المهمة فارغة ، ثم تنتظر مهمة جديدة للانضمام إلى*/synchronized (taskqueue) {taskqueue.wait (500) ؛ }} catch (interruptedException ie) {log.error (ie) ؛ }}/* احصل على المهمة لتنفيذ*/if (runing) {currentThread.lastCommand = null ؛ currentThread.lastCommand = taskqueue.poll ؛ } if (currentThread.lastCommand! = null) {if (currentThread.lastCommand.iscancel) {// إذا تم إلغاء المهمة ، تابع ؛ }/* قم بتنفيذ المهمة* /// تمت مواجهة الخطأ: "، هـ) ؛ } timel1 = System.CurrentTimeMillis - CurrentThread.LastExecuteTime ؛ إذا (timel1 <= 20) {} آخر إذا (timel1 <= 100l) {log.info ("العامل <" " + currentThread.getName +" "> أكمل المهمة:" + currentthread.lastcommand.toString + "وقت التنفيذ:" + timel1) ؛ + ""> التنفيذ طويل الأجل لاستكمال المهمة: " + currentThread.lastCommand.ToString +" يتم حذفه "The Task Script Consuming:" + Timel1) ؛ } currentThread.lastexecuteTime = 0 ؛ }} log.error ("نهايات مؤشر الترابط ، العامل <" " + thread.currentThRead.getName +" "> exit") ؛ } / *** مؤشر ترابط مخصص* / فئة عامة myThread تمتد مؤشر ترابط { / ***** param tid معرف مؤشر الترابط المخصص* group group* param run method* @param name thread name* / public mythread (tid tid ، threadgroup group ، runnable run ، string name) {super ، run ، name) ؛ this._id = tid ؛ } // معرّف مخصص للموضوع العام طويل _id ؛ // مهمة التنفيذ العامة المتقلبة taskevent lastCommand ؛ // حان الوقت للبدء في تنفيذ المهمة العامة المتقلبة الطويلة LastExecuteTime = 0 ؛ public taskevent getLastCommand {return lastCommand ؛ } Public GetLastExecuteTime {return lastExecuteTime ؛ } / ** * Return Thread Custom id * * @return * / Override Public GetId {return _id ؛ }} / *** أوقف مؤشر الترابط ، وقم بتعيين حالة إيقاف مؤشر الترابط ، ولن ينهي مؤشر الترابط على الفور* / public void stop {this.runing = false ؛ } boolean public isruning {return running ؛ } Override public string toString {return "thread {" + "tid =" + tid + "، name =" + this.getName + '}' ؛ }}
لقد أنشأت من ThreadModel
public threadmodel (مجموعة threadgroup ، اسم السلسلة ، int threadcount ، runnable runnable) {synchronized (syn_object) {threadid ++ ؛ tid = threadid ؛ } لـ (int i = 1 ؛ i <= threadcount ؛ i ++) {mythread thread ؛ if (runnable == null) {thread = new myThread (tid ، group ، this ، name + "-" + tid + "-" + i) ؛} آخر {thread = new mythread (tid ، group ، runnable ، name + "-tid +"-" + i) ؛ } thread.start ؛ threads.add (thread) ؛ } this.name = name ؛ }كما يمكن أن نرى ، هنا أدير فئة موضوع MyThread المعلنة
لماذا أفكر في هذا؟ على سبيل المثال ، إذا كنت أقوم بمعالجة بيانات كتابة السجل ، مثل عدم وجود بيانات مشتركة ، وعدم تدفق معالجة المنطقة الحرجة ، يمكنني التفكير في استخدام مؤشرات الترابط N لمعالجة هذا العمل ؛ لن ينتج بيانات قذرة ؛
إذا كنت أرغب في التعاون وطلبت المهارات المهارات ، فأنا بحاجة إلى معالجة قائمة انتظار واحدة ، فيجب أن يكون هناك mythread واحد فقط في ThreadModel. لا يعتبر هذا التنفيذ التسلسلي لوضع الحظر (أو تنفيذ قائمة الانتظار) لحل مشكلة مشاركة البيانات والمساحة الحرجة لخيط ، والتي لم تعد تعتمد على الأقفال ؛
أنا قبيح جدا ، أرجوك سامحني
كما هو موضح في الصورة أعلاه ، سيكون هناك طابوران في كل نموذج ترابط ، واحد TimetAskevent والمهاجم الآخر ، وسيكون هناك خيط توقيت عالمي ؛
تتمثل وظيفة مؤشر ترابط الموقت العالمي في معالجة وإيجاد أن timetAskevent في نموذج ThreadModel يجب تنفيذه ، لذلك تتم إضافته إلى فريق TaschVent ؛ التنفيذ النهائي هو قائمة انتظار المهام
لماذا يجب تخزين TimetAskevent في ترابط ThreadModel المقابل؟ وذلك لأنه ، على سبيل المثال ، بعد أن يعمل مؤشر ترابط (ThreadModel مثيل) لفترة زمنية ، أحتاج إلى إغلاق الموارد وتحريرها ، لذلك يجب أن أذهب إلى أماكن أخرى للعثور على الجدول الزمني المقابل وإزالته ؛
حزمة net.sz.engine.thread ؛ استيراد java.util.hashmap ؛ استيراد java.util.map ؛/** * * <br> * مؤلف المبرمج المتساقط <br> * mail [email protected] <br> * phone 13882122019 <br>/class timerthread يسير بخطود {private antiving syn_object ؛ TimerThread {Super (threadpool.globlthreadgroup ، "Global Timer Thread") ؛ } Override public void rot {when (true) {synchronized (syn_object) {try {syn_object.wait (2) ؛} catch (interruptedException ex) {}} hashmap <long ، threadmodel> hashmap = new hashmap <nud hashMap.EntrySet) {long key = intplset.getKey ؛ threadModel value = entralSet.getValue ؛ value.timerrun ؛ }}}}
المدير المواضيع
package net.sz.engine.thread ؛ استيراد java.util.hashmap ؛ استيراد java.util.concurrent.concurrenthashmap ؛ استيراد net.sz.engine.script.manager.scriptManager ؛ import net.sz.engine.globtimervent ؛ import org.apache.log4j.logger ؛/** * Manager * * <br> * فشل المؤلف المبرمج <br> * البريد [email protected] <br> * الهاتف 13882122019 <br> */الفئة العامة threadpool {static private logger. ثابت عام نهائي طويل Globlthread ؛ الثابتة الثابتة النهائية الموقت النهائي. static النهائي الطويل checkThreadTimerThreadModel ؛ Static Public Final Threadgroup GloblthReadGroup = new ThreadGroup ("Global ThreadGroup") ؛ Static Public Final ThreadGroup UnknownTherDgroup = new ThreadGroup (GloblthReadGroup ، "غير معروف ThreadGroup") ؛ ConcurrentHashMap الخاص الثابت <long ، threadModel> threadMap = جديد concurrenthashMap <> ؛ public static void main (string [] args) {threadpool.addtimertask (globlthread ، new timertaskevent (1000) {Overridepublic void Run {log.error ("sssss") ؛}}) ؛ } static {// إنشاء مؤشر الترابط العالمي globlthread = addThreadModel (GloblthReadGroup ، "Globlthread") ؛ . // استعلام عن نموذج توقيت استهلاك الخادم AddTimerTask (Globlthread ، New PrintLnserverMemoryTimervent) ؛ // إنشاء مؤشر ترابط TIMER GLOBLTIMERTHREAD = NEW TIMERTHREAD ؛ globltimerthread.start ؛ // تحقق من مؤشر ترابط checkThreadTimerThreadModel = AddThreadModel (GloblthReadGroup ، "Check ThreadTimer Event") ؛ AddTimerTask (checkThreadTimerThreadModel ، checkThreadTimervent الجديد) ؛ } / ** * عند حذف نموذج مؤشر ترابط المعرف المحدد ، قم بتعيين الحالة على حالة الإيقاف * * param tid * @return * / static public threadmodel إزالة (tid long) {threadmodel remove = threadmap.remove (tid) ؛ if (إزالة! = null) {remove.stop ؛ } إرجاع إزالة ؛ } / ** * احصل على جميع مؤشرات الترابط في مجموعة مؤشرات الترابط * * return * / static public concurrenthashmap <long ، threadmodel> getThReadMap {return threadmap ؛ } / ** * احصل على مؤشر ترابط في مجموعة مؤشرات الترابط * * param threadId * @RETURN * / static public threadmodel getThReadModel (long threadId) {threadmodel get = threadmap.get (threadID) ؛ إذا (get == null) {log.error ("لا يمكن العثور على نموذج مؤشر الترابط:" + threadId ، استثناء جديد ("لا يمكن العثور على نموذج مؤشر الترابط:" + threadId)) ؛ } الحصول على ؛ } / ** * قم بتسجيل مؤشر ترابط إلى مجموعة مؤشرات الترابط * <br> * التجميع الافتراضي غير المعروف أنثريدجوب * * param اسم مؤشر الترابط * @REGRURN * / static public addthreadmodel (اسم السلسلة) {return AddThreadModel (غير معروف ، الاسم) ؛ } / ** * قم بتسجيل مؤشر ترابط إلى مجموعة مؤشرات الترابط * <br> * التجميع الافتراضي غير المعروف عن طريق المجموعة * * param اسم threadname * param threadcount * @return * / static public addThreadModel (اسم السلسلة ، int threadcount) {return AddThreadModel (غير معروف ، اسم ، threadcount) ؛ } / *** قم بتسجيل مؤشر ترابط مع مجموعة مؤشرات الترابط** @Param Group Thread Thunding Information* param name name name* / static public addThreadModel (مجموعة Threadgroup ، اسم السلسلة) {return AddThreadModel (Group ، name ، 1) ؛ } / *** قم بتسجيل مؤشر ترابط مع مجموعة مؤشرات الترابط** @Param Group Thread Terming Information* param name threadname* param threadcount* @return* / static public addthreadmodel (threadgroup group ، اسم السلسلة ، int threadcount) } / *** قم بتسجيل مؤشر ترابط مع مجموعة مؤشرات الترابط** param group threadgroup معلومات* param اسم threadname* param runnable* param threadcount* / static public addThreadModel (مجموعة threadgroup ، string name ، runnable ، inthoundcount) {threadmodel إرجاع AddThreadModel (ThreadModel) ؛ } / ** * قم بتسجيل مؤشر ترابط مع مجموعة مؤشرات الترابط * * param threadmodel * / static public addThreadModel (threadmodel threadmodel) {threadmap.put (threadmodel.getid ، threadmodel) ؛ إرجاع threadmodel.getID ؛ } / ** * إضافة Task * * param threadId * param task * @return * / static public boolean addTask (threadId long ، taskevent task) {threadmodel threadmodel = getThEadModel (threadid) ؛ if (threadmodel! = null) {threadmodel.addtask (task) ؛ return true ؛ } إرجاع خطأ ؛ } / ** * إضافة Timer Task * * param threadId * param task * @return * / static boolean addtimertask (threadid long ، timertaskevent task) {threadmodel threadmodel = getThReadModel (threadid) ؛ if (threadmodel! = null) {threadmodel.addtimer (task) ؛ return true ؛ } إرجاع خطأ ؛ } / ** * أضف مهمة ، أضف المهمة إلى مؤشر الترابط الحالي * * param task * regurn * / static boolean addCurrentThReadTask (Taskevent Task) {thread currentThread = thread.currentThread ؛ if (currentThread مثيل threadmodel.mythread) {long threadId = currentThread.getId ؛ threadModel threadModel = getThReadModel (threadId) ؛ if (threadmodel! = null) {threadmodel.adddtask (task) ؛ return true ؛ }} إرجاع خطأ ؛ } / ** * أضف مهمة مؤقت وأضف مهمة إلى مؤشر الترابط الحالي * * param المهمة * regurn * / static boolean addCurrentThReadTimArk (TimertAskevent Task) {thread currentThread = thread.currentThread ؛ if (currentThread مثيل threadmodel.mythread) {long threadId = currentThread.getId ؛ threadmodel threadmodel = getThReadModel (threadId) ؛ if (threadmodel! = null) {threadmodel.addtimer (task) ؛ return true ؛ }} إرجاع خطأ ؛ }}
بعد ذلك ، دعونا نلقي نظرة على الاستخدام
رمز مقدمة الموضوع في المقالة السابقة
يبرز الفراغ الثابت العام (سلسلة [] args) InterruptedException {// مؤشر ترابط التوازي ، مؤشرات ترابط متعددة تنفذ مهام/وظائف متعددة مؤشر ترابط جديد (جديد Run1) .start ؛ موضوع جديد (جديد Run2) .start ؛ }. }} // Task2 static class run2 تنفذ Runnable {Override public void Run {// execute task 3 run3 ؛ // excution task 1 run1 ؛ // execute task 2 run2 ؛ }} // Task 1 public static void run1 {system.out.println ("run1->" + system.currentTimeMillis) ؛ } // Task 2 public static void run2 {system.out.println ("run2->" + system.currentTimeMillis) ؛ } // Task 3 public static void run3 {system.out.println ("run3->" + system.currentTimeMillis) ؛ }قمت بتبديل الرمز إلى الوضع
يتوازى الفراغ الثابت العام (السلسلة [] args) interruptedException {// مؤشرات الترابط متوازية ، تقوم مؤشرات ترابط متعددة بمهام متعددة/وظيفة test1 = threadpool.addthreadModel ("Test Thread-1") ؛ test2 = threadpool.addthreadModel ("Test Thread-2") ؛ // إضافة Task threadpool.addtask (test1 ، new Run1) ؛ threadpool.addtask (test2 ، new Run2) ؛ // إضافة Timer Task ThreadPool.AddTimerTask (Test1 ، New Timerrun1) ؛ Threadpool.AddTimerTask (Test2 ، New Timerrun2) ؛ }. }} // Task1 static class timerrun1 يمتد timertaskevent {public timerrun1 {super (500) ؛ // 500ms execution execution} override public void run {// تنفيذ المهمة 1 run1 ؛ // تنفيذ المهمة 3 ؛ }} // Task2 static class Run2 يمتد taskevent {Override public void Run {// execute task 3 run3 ؛ // تنفيذ المهمة 1 run1 ؛ // تنفيذ المهمة 2 run2 ؛ }} // Task2 static class timerrun2 يمتد timertaskevent {public timerrun2 {super (500) ؛ // 500ms execution execution} Override public void run {// execute task 3 run3 ؛ // تنفيذ المهمة 1 ؛ }} // task1 public static void run1 {system.out.println ("run1->" + system.currentTimeMillis) ؛ } // task2 public static void run2 {system.out.println ("run2->" + system.currentTimeMillis) ؛ } // Task 3 public static void run3 {system.out.println ("run3->" + system.currentTimeMillis) ؛ }بعد ذلك ، دعونا نلقي نظرة على تأثير التنفيذ
RUN1-> 1472120543013RUN3-> 1472120543013RUN3-> 1472120543017RUN1-> 1472120543017RUN2-> 14721205 43017RUN1-> 1472120543517RUN3-> 1472120543517RUN2-> 1472120543517RUN1-> 1472120544018RUN3-> 147 2120544018RUN2-> 1472120544018RUN1-> 1472120544520RUN3-> 1472120544520RUN2-> 1472120544520RUN1 -> 1472120545021Run3-> 1472120545021Run2-> 1472120545021RUN1-> 1472120545521RUN3-> 1472120545521
كل شيء طبيعي
هذا هو نموذج الخيوط المخصص الخاص بي ؛
في هذه المرحلة ، تم الانتهاء من نموذج الخيوط المخصصة الخاصة بي ؛
إذن ما هي المزايا والعيوب؟
الميزة هي أن التحكم في تدفق البيانات واضح للغاية ، بما في ذلك وضع التنفيذ الحالي ، وكذلك المواضيع المتوقعة للمراقبة وتنفيذ مؤقت المهام ؛
العيوب ، لا يزال نموذج الخيط المخصص هذا لا يمكنه حل مشكلة أمان بيانات الخيوط والمنطقة الحرجة ، ولا يزال يتعين حله بواسطة الأقفال أو النماذج الأخرى في الوقت المناسب ؛
آمل أن يشير الآلهة العظيمة إلى أوجه القصور ، حتى أتمكن من تصحيحها على الفور.