Rumah  >  Artikel  >  Java  >  Bagaimanakah CompletionService boleh digunakan untuk mengoptimumkan menunggu senarai niaga hadapan dan mengendalikan pengecualian dengan cekap?

Bagaimanakah CompletionService boleh digunakan untuk mengoptimumkan menunggu senarai niaga hadapan dan mengendalikan pengecualian dengan cekap?

Patricia Arquette
Patricia Arquetteasal
2024-10-25 19:58:29928semak imbas

How can CompletionService be used to optimize waiting for a list of futures and handle exceptions efficiently?

Mengoptimumkan Senarai Masa Depan Menunggu dengan CompletionService

Apabila bekerja dengan senarai niaga hadapan, adalah penting untuk cekap menunggu penyelesaiannya atau mengendalikan pengecualian untuk mengelakkan kelewatan yang tidak perlu.

Andaikan anda mempunyai kaedah berikut yang mengembalikan senarai niaga hadapan:

List<Future<O>> futures = getFutures();

Untuk menunggu selesai atau menangkap pengecualian, pendekatan naif mungkin:

wait() {
  for(Future f : futures) {
    try {
      f.get();
    } catch(Exception e) {
       //Specific exception handling
       //Exception in a future, stop waiting
       return;
    }
  }
}

Walau bagaimanapun, pendekatan ini menunggu untuk setiap masa hadapan tanpa mengira pengecualian pada masa hadapan sebelumnya.

Penyelesaian adalah dengan menggunakan Perkhidmatan Penyiapan untuk menerima niaga hadapan apabila ia tersedia. Jika pengecualian berlaku, anda boleh membatalkan tugasan lain:

Executor executor = Executors.newFixedThreadPool(4);
CompletionService<SomeResult> completionService = new ExecutorCompletionService<SomeResult>(executor);

//Submit tasks
for(int i = 0; i < 4; i++) {
  completionService.submit(() -> {
    ...
    return result;
  });
}

int received = 0;
boolean errors = false;

while(received < 4 && !errors) {
  Future<SomeResult> resultFuture = completionService.take(); //Blocks if none available
  try {
    SomeResult result = resultFuture.get();
    received++;
    ... //Process result
  } catch(Exception e) {
    //Log and set error flag
    errors = true;
  }
}

Dalam pendekatan ini, tugasan diserahkan kepada pelaksana dan tugasan yang telah selesai diterima melalui perkhidmatan penyiapan. Jika pengecualian berlaku dalam tugasan yang diterima, gelung sementara ditamatkan dan anda boleh membatalkan sebarang tugasan yang tinggal menggunakan kaedah shutdownNow() pelaksana.

Atas ialah kandungan terperinci Bagaimanakah CompletionService boleh digunakan untuk mengoptimumkan menunggu senarai niaga hadapan dan mengendalikan pengecualian dengan cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn