Изпълнител, ИзпълнителСервиз, Изпълнител - 1

„Здрасти, Амиго!“

„Нищо не е перфектно, когато е създадено за първи път. Същото важи и за нишките. С времето създателите на Java се убедиха в недостатъците на интерфейса Runnable. Той не поддържаше хвърляне на изключения и не позволяваше да се открие резултат от изпълнение на задачи..."

„Интерфейсът Runnable е по-подходящ за големи независими задачи, отколкото за малки подзадачи, които искате да изпълнявате дузина наведнъж и след това да събирате техните резултати.“

„Ето защо беше изобретен интерфейсът Callable . Той е много по-подходящ за паралелно изпълнение на малки задачи от Runnable и Thread, отчасти защото е общ интерфейс.“

„Ето типична реализация на интерфейса:“

Пример
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();
 }
}

„За разлика от Runnable , тук трябва да заменим метода за извикване, който връща резултат от типа, определен от аргумента тип. Този подход е много по-удобен от метода за изпълнение на интерфейса Runnable, който връща void. Понякога разработчиците трябваше да измислят различни заобикалящи решения за получаване на резултат от нишка."

"Виждам."

„А сега вижте How Callable може да работи заедно с ThreadPoolExecutor:

"Първо, методът за изпращане на класа ThreadPoolExecutor връща параметризиран обект Future. Можете да използвате този обект, за да разберете дали дадена задача е завършена и да получите резултата."

„Ето How работи:“

Пример
// 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();

„Далеч! Особено харесвам класа Future. Какви методи има?“

„Ето най-интересните:“

Метод Описание
boolean cancel(boolean mayInterrupt);
Спира задачата.
boolean isCancelled();
Връща true, ако задачата е спряна.
boolean isDone();
Връща true, ако задачата е изпълнена.
V get() throws InterruptedException, ExecutionException;
Връща резултата от извиквания метод or хвърля изключение, ако е възникнало такова.

„Готино! Така че можете също да спрете задачи.“

„Не разчитайте твърде много на това – не всяка нишка може да спре. Но ако задача все още е в опашката, тогава това ще работи добре.“

„Харесва ми този подход. Много по-удобно е, отколкото сам да създаваш нишки и след това да се опитваш да извлечеш резултат от тях.“

"Страхотно. С това ще приключим днес."