Java Concurrency - Futures dan Callables

Objek java.util.concurrent.Callable dapat mengembalikan hasil komputasi yang dilakukan oleh thread berbeda dengan antarmuka runnable yang hanya dapat menjalankan thread. Objek Callable mengembalikan objek Future yang menyediakan metode untuk memantau kemajuan tugas yang sedang dijalankan oleh utas. Objek Future dapat digunakan untuk memeriksa status Callable dan kemudian mengambil hasilnya dari Callable setelah utas selesai. Ini juga menyediakan fungsionalitas batas waktu.

Sintaksis

//submit the callable using ThreadExecutor
//and get the result as a Future object
Future<Long> result10 = executor.submit(new FactorialService(10));
 
//get the result using get method of the Future object
//get method waits till the thread execution and then return the result of the execution.
Long factorial10 = result10.get();

Contoh

Program TestThread berikut menunjukkan penggunaan Futures dan Callables di lingkungan berbasis thread.

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException,
      ExecutionException {

      ExecutorService executor = Executors.newSingleThreadExecutor();

      System.out.println("Factorial Service called for 10!");
      Future<Long> result10 = executor.submit(new FactorialService(10));

      System.out.println("Factorial Service called for 20!");
      Future<Long> result20 = executor.submit(new FactorialService(20));

      Long factorial10 = result10.get();
      System.out.println("10! = " + factorial10);

      Long factorial20 = result20.get();
      System.out.println("20! = " + factorial20);

      executor.shutdown();
   }  

   static class FactorialService implements Callable<Long> {
      private int number;

      public FactorialService(int number) {
         this.number = number;
      }

      @Override
      public Long call() throws Exception {
         return factorial();
      }

      private Long factorial() throws InterruptedException {
         long result = 1; 
         
         while (number != 0) { 
            result = number * result; 
            number--; 
            Thread.sleep(100); 
         }
         return result;	
      }
   }
}

Ini akan menghasilkan hasil sebagai berikut.

Keluaran

Factorial Service called for 10!
Factorial Service called for 20!
10! = 3628800
20! = 2432902008176640000