في العامين الماضيين من العمل في Android ، من خلال البحث عن رمز مصدر Android ، سيكون لدي أيضًا بعض الفهم للمعالجة المتزامنة لـ Java المتعددة.
لذا فإن السؤال هو ، كيفية تنفيذ تجمع الخيوط التسلسلية؟
ما هو تجمع الخيوط التسلسلية؟
وبعبارة أخرى ، يجب أن يكون للكائنات القابلة للتشغيل آلية قائمة انتظار ، والتي تدخل من ذيل قائمة الانتظار بالتسلسل ، ويختار Runnable من رأس قائمة الانتظار للتنفيذ.
بما أن لدينا فكرة ، دعنا ننظر في بنية البيانات المطلوبة؟
نظرًا لأننا نقوم بإدخال الكائن القابل للتشغيل من نهاية قائمة الانتظار وتنفيذ الكائن القابل للتشغيل من رأس قائمة الانتظار ، نحتاج بطبيعة الحال إلى قائمة انتظار. زودتنا SDK من Java ببنية بيانات قائمة انتظار جيدة ، مثل قائمة الانتظار المزدوجة: Arraydeque <Runnable>.
استيراد java.util.arraydequ ؛ استيراد java.util.concurrent.blockingqueue ؛ استيراد java.util.concurrent.linkedBlockingDeque ؛ استيراد java.util.concurrent.throdfactory ؛ استيراد java.util.concurrent.threadpoolexecutor java.util.concurrent.atomic.atomicinteger ؛/*** تم إنشاؤه بواسطة Wzy في 16-1-5. */public class serialexecutor {private runnable mactive ؛ arraydequ <Runnable> marraydequ = new arraydequ <> () ؛ Private Static Final CPU_COUNT = RUNTITY.GETRUNTIME (). int static int core_pool_size = cpu_count + 1 ؛ int static int int maximum_pool_size = cpu_count * 2 + 1 ؛ int static int int int keep_alive = 1 ؛ blockeque static static static <Runnable> spoolworkqueue = new LinkedBlockingDeque <> (128) ؛ private static final threadfactory sthreadfactory = new threadfactory () {private final atomicinteger mcount = new AtomicInteger (1) ؛ Override public thread newThread (runnable r) {return new thread (r ، "serial thread #" + mcount.getandincrement ()) ؛ }} ؛ private Static Final ThreadPoolexecutor thread_executor = new threadpoolexecutor (core_pool_size ، maximum_pool_size ، keep_alive ، timeunit.seconds ، spoolworkqueue ، sthreadfactory) ؛ تنفيذ الفراغ المتزامن العام (Runnable R) {marraydequ.offer (new RunNable () {Override public void run () {try {r.run () ؛} أخيرًا {schedulenext () ؛}}}) ؛ // عندما تنضم إلى قائمة الانتظار ، تكون Macive فارغة ، لذلك تحتاج إلى استدعاء طريقة Schedulenext يدويًا إذا (mactive == null) {Schedulenext () ؛ }} private void schedulenext () {if ((mactive = marraydequ.poll ())! = null) {thread_executor.execute (mactive) ؛ }} public static void main (string [] args) {serialexecutor serialexecutor = new serialexecutor () ؛ لـ (int i = 0 ؛ i <10 ؛ i ++) {final int j = i ؛ serialexecutor.execute (new RunNable () {Override public void run () {system.out.println ("num هو:" + (j + 1)) ؛ حاول {thread.sleep (1000) ؛} catch (interruptedException e) {eprintstacktrace () ؛}}}) ؛ }}}نتائج التنفيذ هي كما يلي:
Num هو: 1
العدد هو: 2
العدد هو: 3
العدد هو: 4
العدد هو: 5
العدد هو: 6
العدد هو: 7
العدد هو: 8
العدد هو: 9
العدد هو: 10
ما ورد أعلاه هو كل محتوى هذه المقالة حول تحليل مثيلات تجمع الخيوط التسلسلية من Concurrency Java ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!