سؤال

أنا مرتبك على ما يلي:
لاستخدام المواضيع في برنامج Java ، فإن أبسط طريقة هي تمديد فئة مؤشرات الترابط وتنفيذ الواجهة القابلة للتشغيل (أو ببساطة تنفيذ Runnable).
لبدء تنفيذ الموضوع. يجب أن ندعو طريقة سلسلة الموضوعات () ، والتي بدورها تم تشغيل طريقة المكالمات () من مؤشر الترابط. وهكذا يبدأ الموضوع.
الطريقة تبدأ () (ما لم أكن مخطئًا) يجب أن يسمى بالضبط وفقط مرة واحدة لكل موضوع. نتيجة لذلك ، لا يمكن إعادة استخدام مثيلات الخيوط إلا إذا كانت طريقة التشغيل نفسها تعمل في بعض الحلقة اللانهائية التي تسهل تنفيذًا مخصصًا لإعادة استخدام مؤشر الترابط.
الآن جافادوكنص الارتباطيقول

سيتم إعادة استخدام المكالمات المرفقة للتنفيذ من مؤشرات الترابط التي تم إنشاؤها مسبقًا إذا كان ذلك متاحًا

لا أفهم كيف يتم تنفيذ ذلك. أقدم في طريقة التنفيذ لطريقة المنفذ موضوعي المخصص على سبيل المثال

  ExecutorService myCachedPool = Executors.newCachedThreadPool();
  myCachedPool.execute(new Runnable(){public void run(){  
     //do something time consuming

  }});

كيف يمكن إعادة استخدام هذا الخيط المخصص الذي أقوم به إلى إطار المنفذ؟
هل يُسمح لـ Executor بالاتصال بـ Start () أكثر من وقت واحد ، بينما لا يمكننا في برامجنا؟ هل أسيء فهم شيء ما؟

شكرًا لك.

هل كانت مفيدة؟

المحلول

لاحظ أنه ليس كذلك Executor هذا يدعو start() - انها ExecutorService. ولا ، إنه لا يتصل start() مرتين. لا تبدأ المهمة التي تعطيها مباشرة باستخدامها Thread.start()... بدلاً من ذلك ، يبدأ موضوعًا يعرف قائمة انتظار تجمع الخيوط. سينتظر الخيط بشكل أساسي حتى يكون هناك بعض العمل للقيام به ، ثم استقله وتنفيذه ، قبل العودة إلى الانتظار. لذلك على الرغم من أن الموضوع يؤدي عدة مهام ، Thread.start() يسمى فقط مرة واحدة.

تحرير: إذا حكمنا من خلال التعليقات ، فأنت مرتبك بعض الشيء بشأن الفرق بين أ Runnable (وهي مهمة يتم تنفيذها) و Thread (وهو ما ينفذ المهام).

يمكن للمؤشر نفسه تنفيذ مهام متعددة. للحصول على مثال بسيط للغاية لا تستخدم تجمع الخيوط ، ضع في اعتبارك هذا:

public class MultiRunnable implements Runnable
{
    private final List<Runnable> runnables;

    public MultiRunnable(List<Runnable> runnables)
    {
        this.runnables = runnables;
    }

    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}

(تجاهل مشكلات سلامة الخيط المحتملة لاستخدام أ List<T> من خيوط متعددة.)

يمكنك إنشاء مجموعة كاملة من Runnable مهام قادرة على القيام بأشياء مختلفة ، ثم إنشاء واحد MultiRunnable لتشغيلها بدورها. تمرير تلك الحالة من MultiRunnable داخل ال Thread مُنشئ ، ثم عند بدء تشغيل الخيط ، سيتم تنفيذ كل من المهام الأصلية القابلة للتشغيل. هل هذا يساعد؟

نصائح أخرى

لا يستدعي Start () أكثر من مرة ؛ بدلاً من ذلك ، لا يكمل الخيط الموجود في المسبح ، ولكنه يبقى على قيد الحياة --- الانتظار. رمز المصدر متاح للتنزيل إذا كنت تريد النظر إليه.

يمكن لكل موضوع في تجمع الخيوط ببساطة wait() لكي يقوم المنفذ بتسليمه جديدًا ، لكن الخيط الخاص run() الطريقة لم تكتمل. إنه ينتظر ببساطة أن يتم إعطاءه الجديد إلى المنفذ.

"لبدء" موضوع أكثر من مرة ، قم بإنشاء تشغيل. فمثلا:

//NO
private class T extends Thread { //not necessary to implement runnable
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    a.start();
    a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}

في حين أن،

//Yes
private class T implements Runnable {
    public void run(){
        //...
    }
}
void someMethod(){
    T a = new T();
    new Thread(a).start();
    new Thread(a).start(); //YES YES YES
}

من الممكن أيضًا القيام بذلك:

void someMethod(){
    final Runnable r = new Runnable(){
        public void run(){
            //...
        }
    };
    new Thread(r).start();
    new Thread(r).start();
}
// r could also be a field of you class. 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top