سؤال

لدي حاليا رمز يفعل ما يلي:

private final static ExecutorService pool = Executors.newCachedThreadPool();
public void foo(){
    FutureTask<MyObject> first_task = createFutureTask();
    FutureTask<MyObject> second_task = createFutureTask();
    ...

    pool.execute(first_task);
    pool.execute(second_task);
    ....
    first_task.get();
    second_task.get();
    ...
    System.out.println(time taken);
}

المشكلة التي أواجهها هي أن أحصل على كل مهمة من المهمة المستقبلية لطباعة الوقت الذي تستغرقه عند إجراء الحساب ، لذلك على سبيل المثال على وحدة التحكم سأرى

first_task : 20000ms
second_task : 18000ms
...

لكن الوقت الإجمالي (System.out.println(time taken)) أكبر بكثير ثم أطول وقت تستغرقه أي مهمة مستقبلية ، لذلك تمشيا مع هذا المثال ، ستستغرق الطريقة حوالي دقيقة واحدة (مقارنة بعشرينات First_Task).

كنت تحت الانطباع بأن هذه المهام المستقبلية تعمل بالتوازي ولكن من التوقيت يبدو كما لو أنها تدير واحدة تلو الأخرى. هل أستخدم واجهة برمجة التطبيقات هذه بشكل صحيح؟

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

المحلول

أنت تستخدم واجهة برمجة التطبيقات بشكل صحيح ، ولكن ضع في اعتبارك أن كل مهمة تعمل في مؤشر ترابط منفصل ، وليس عملية منفصلة (وبالتالي ليست بالضرورة بالتوازي).

سيتعين على كل مؤشر ترابط التشغيل على قلب وحدة المعالجة المركزية منفصلة لتنفيذها بالفعل في نفس الوقت. سواء كان ذلك ممكنًا أم لا ، يعتمد هذا على جهازك ، وحمله الحالي ، وكيف يمكن لـ JVM و OS قادرين على جدولة المواضيع عبر النوى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top