22 Ekim 2018 Pazartesi

FutureTask Sınıfı - Callable Nesneyi Runnable Nesneye Adapte Eder

Giriş
Açıklması şöyle
... as the parameter for the Thread constructor needs to implement Runnable interface, which is not implemented by Callable. Hence, in order to solve this, we can use FutureTask. FutureTask is an implementation class which implements RunnableFuture interface, which extends Runnable interface.
Yani bu sınıf hem Future hem de Runnable arayüzlerinden kalıtır. Böylece FutureTask ExecutorService.execute() veya Thread(...).start() şeklinde kullanılabilir ve de bir sonuç dönebilir.

Kalıtım şöyle
Runnable
Future
  RunnableFuture
    FutureTask

Callable Kullanımı
Örnek - Thread
Şöyle yaparız
Callable<JSONObject> userCall = new Callable<JSONObject>() {
  @Override
  public JSONObject call() throws Exception {
    //Use userName API
    String name = remoteService.getUserName(userId);
    ...;
  }
};

FutureTask<JSONObject> userFuture = new FutureTask<>(userCall);

new Thread(userFuture).start();

try {
  userFuture.get());
} catch (InterruptedException | ExecutionException e) {
  ...
}
Örnek - ExecutorService
Şöyle yaparız.
FutureTask<String> futureTask = new FutureTask<String>(new Callable<String>() {
  public String call() throws Exception {
    return ...;
  }
});
executor.execute(futureTask);
...
String value = futureTask.get();
Runnable Kullanımı
Örnek - Thread
Şöyle yaparız. Burada Runnable bitince null değeri döndürülür
Runnable task = ...
FutureTask<Runnable> futureTask = new FutureTask<>(task, null);
new Thread(futureTask).start();
return futureTask.get;


Hiç yorum yok:

Yorum Gönder