Pelaksana, PelaksanaPerkhidmatan, Pelaksana - 1

"Hai, Amigo!"

"Tiada yang sempurna apabila ia mula-mula dibuat. Perkara yang sama berlaku untuk benang. Lama-kelamaan, pencipta Java menjadi yakin dengan kelemahan antara muka Runnable. Ia tidak menyokong pengecualian lontaran dan tidak memungkinkan untuk mengetahui hasil daripada melaksanakan tugas…"

"Antara muka Runnable lebih sesuai untuk tugasan bebas yang besar daripada subtugas kecil yang anda mahu jalankan sedozen pada satu masa, dan kemudian kumpulkan hasilnya."

"Itulah sebabnya antara muka Boleh Panggil dicipta. Ia lebih sesuai untuk pelaksanaan tugasan kecil yang selari daripada Runnable dan Thread, sebahagiannya kerana ia adalah antara muka generik."

"Berikut ialah pelaksanaan biasa antara muka:"

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 mengatasi kaedah panggilan, yang mengembalikan hasil daripada jenis yang ditentukan oleh hujah jenis. Pendekatan ini jauh lebih mudah daripada kaedah larian antara muka Runnable, yang mengembalikan tidak sah. Kadang-kadang pembangun terpaksa menghasilkan pelbagai penyelesaian untuk mendapatkan hasil thread."

"Saya faham."

"Dan sekarang lihat bagaimana Callable boleh bekerjasama dengan ThreadPoolExecutor:

"Pertama, kaedah penyerahan kelas ThreadPoolExecutor mengembalikan objek Masa Depan berparameter. Anda boleh menggunakan objek ini untuk mengetahui sama ada tugasan jika selesai dan untuk mendapatkan hasilnya."

"Begini cara ia berfungsi:"

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 sangat suka kelas Masa Depan. Apakah kaedah yang ada?"

"Berikut adalah yang paling menarik:"

Kaedah Penerangan
boolean cancel(boolean mayInterrupt);
Menghentikan tugas.
boolean isCancelled();
Mengembalikan benar jika tugasan dihentikan.
boolean isDone();
Mengembalikan benar jika tugasan selesai dilaksanakan.
V get() throws InterruptedException, ExecutionException;
Mengembalikan hasil kaedah panggilan atau membuang pengecualian jika berlaku.

"Cool! Jadi anda juga boleh menghentikan tugasan."

"Jangan terlalu bergantung pada perkara ini—tidak setiap utas boleh berhenti. Tetapi jika tugasan masih dalam baris gilir, maka ini akan berfungsi dengan baik."

"Saya suka pendekatan ini. Ia lebih mudah daripada mencipta benang sendiri dan kemudian cuba mengeluarkan hasil daripadanya."

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