Pelaksana, PelaksanaLayanan Pelaksana, Pelaksana - 1

"Hai, Amigo!"

"Tidak ada yang sempurna saat pertama kali dibuat. Hal yang sama berlaku untuk utas. Belakangan, pencipta Java menjadi yakin akan kekurangan antarmuka Runnable. Itu tidak mendukung melempar pengecualian dan tidak memungkinkan untuk mengetahui hasil dari pelaksanaan tugas..."

"Antarmuka Runnable lebih cocok untuk tugas mandiri yang besar daripada untuk subtugas kecil yang ingin Anda jalankan selusin sekaligus, lalu kumpulkan hasilnya."

"Itulah mengapa antarmuka Callable diciptakan. Ini jauh lebih cocok untuk eksekusi paralel tugas-tugas kecil daripada Runnable dan Thread, sebagian karena ini adalah antarmuka umum."

"Inilah implementasi antarmuka yang khas:"

Contoh
class ReverseString implements Callable<String>
{
 String str;

 ReverseString(String str)
 {
  this.str = str;
 }

 public String call() throws Exception
 {
  StringBuilder builder = new StringBuilder(str);
  builder.reverse();
  return builder.toString();
 }
}

"Tidak seperti Runnable , di sini kita perlu mengganti metode panggilan, yang mengembalikan hasil dari tipe yang ditentukan oleh argumen type. Pendekatan ini jauh lebih nyaman daripada metode run antarmuka Runnable, yang mengembalikan batal. Kadang-kadang pengembang harus datang dengan berbagai solusi untuk mendapatkan hasil utas."

"Jadi begitu."

"Dan sekarang lihat bagaimana Callable dapat bekerja sama dengan ThreadPoolExecutor:

"Pertama, metode pengiriman kelas ThreadPoolExecutor mengembalikan objek Masa Depan berparameter. Anda dapat menggunakan objek ini untuk mengetahui apakah suatu tugas telah selesai dan untuk mendapatkan hasilnya."

"Begini cara kerjanya:"

Contoh
// 1. Create a ThreadPoolExecutor
ExecutorService service = Executors.newFixedThreadPool(5);

// 2. Add a task to it
Future<String> task = service.submit(new ReverseString("Amigo"));

// 3. Wait until the task is done
while(!task.isDone())
{
 Thread.sleep(1);
}

// 4. Try to get the result
//We will get either the result, or an exception if one occurred while the task was being executed
try
{
 System.out.println("Full string : " + task.get());
}
catch (Exception ie)
{
 ie.printStackTrace(System.err);
}
  
// 5. Stop the ThreadPool.
service.shutdown();

"Jauh! Saya terutama menyukai kelas Masa Depan. Metode apa yang dimilikinya?"

"Ini yang paling menarik:"

metode Keterangan
boolean cancel(boolean mayInterrupt);
Menghentikan tugas.
boolean isCancelled();
Mengembalikan nilai true jika tugas dihentikan.
boolean isDone();
Mengembalikan nilai true jika tugas selesai sedang dieksekusi.
V get() throws InterruptedException, ExecutionException;
Mengembalikan hasil dari metode panggilan atau melempar pengecualian jika terjadi.

"Keren! Jadi kamu juga bisa menghentikan tugas."

"Jangan terlalu mengandalkan ini—tidak semua utas bisa berhenti. Tapi jika tugas masih dalam antrean, ini akan berfungsi dengan baik."

"Saya suka pendekatan ini. Ini jauh lebih nyaman daripada membuat utas sendiri dan kemudian mencoba menarik hasilnya."

"Bagus. Di situlah kita akan berakhir hari ini."