معرفة متى جميع المواضيع كاملة والتعامل مع الاستثناءات

StackOverflow https://stackoverflow.com/questions/1434573

  •  07-07-2019
  •  | 
  •  

سؤال

وأنا باستخدام إطار المنفذ لبدء عدة المواضيع باستخدام threadpool أي بمعنى newFixedThreadPool. يمكنني استخدام threadpool.submit (aThread) لتقديم فرص العمل ليتم تنفيذها من قبل threadpool وهذا يعمل بشكل جيد ولكن أنا بحاجة إلى تحديد عندما تكون جميع المواضيع كاملة حتى أتمكن من الاستمرار في معالجة أخرى. نظرت إلى استخدام Future.get () الذي يمنع حتى موضوع اكتمال المشكلة هنا هو أن فإنه يمنع حتى نتيجة لذلك متوفرة. كنت قد بحثت أيضا في استخدام مستمر استدعاء الأسلوب isTerminated () تليها النوم بعد صدور الاغلاق للتحقق مما إذا كل المواضيع كاملة ولكن هذا لا يبدو أنيق بالنسبة لي. هل هناك طريقة أخرى أنظف لهذا؟ أيضا إذا كان هناك استثناء أثيرت في أي واحد من المواضيع أريد أن أكون قادرة على إنهاء جميع المواضيع الأخرى التي تعمل وأيضا إيقاف أي اصطفوا موضوع في بركة من بدء التشغيل. ما هي أفضل آلية للقيام بذلك؟

ونتطلع الى الاستماع الردود الخاصة بك

وTIA

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

المحلول

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

يمكنك كتابة بسيطة المجمع من شأنها أن تفعل هذا للحصول على أي Runnable.

وأو بعد هذا المثال، يمكنك توسيع فكرة للالتفاف أي Callable.

class CallbackTask<T>
  implements Callable<T>
{

  private final Callable<? extends T> task;

  private final Callback<T> callback;

  CallbackTask(Callable<? extends T> task, Callback<T> callback)
  {
    this.task = task;
    this.callback = callback;
  }

  public T call()
    throws Exception
  {
    try {
      T result = task.call();
      callback.complete(result);
      return result;
    }
    catch (Exception ex) {
      callback.failed(ex);
      throw ex;
    }
  }

}

نصائح أخرى

استخدم ExecutorService #shutdown () ثم <وأ href = "http://java.sun.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#awaitTermination٪28long،٪20java. util.concurrent.TimeUnit٪ 29 "يختلط =" noreferrer "> ExecutorService # awaitTermination ()

وعلى سبيل المثال:

ExecutorService service = Executors.newCachedThreadPool();
service.submit(...);
service.submit(...);
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

// All tasks have now finished

وبقدر ما تعلمك عندما فشل مهمة مع استثناء. سيكون لديك لتوفير ThreadFactory إلى ExecutorService التي تضع على "معالج استثناء uncaught" لكل موضوع يخلق. يمكن لهذا المعالج استثناء ثم إنهاء المهام قيد التشغيل.

scroll top