Végrehajtó, végrehajtó szolgáltatás, végrehajtó – 1

– Szia Amigo!

"Semmi sem tökéletes az első elkészítésekor. Ugyanez igaz a szálakra is. Idővel a Java készítői meggyőződtek a Runnable felület hiányosságairól. Nem támogatta a kivételek dobását, és nem tette lehetővé a a feladatok végrehajtásának eredménye..."

"A Runnable felület alkalmasabb nagy független feladatokra, mint kis részfeladatokra, amelyeket egyszerre egy tucatnyian szeretne futtatni, majd összegyűjti az eredményeket."

"Ezért találták ki a Callable felületet. Sokkal jobban alkalmas kisebb feladatok párhuzamos végrehajtására, mint a Runnable és a Thread, részben azért, mert ez egy általános felület."

"Íme a felület tipikus megvalósítása:"

Példa
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();
 }
}

"Eltérően a Runnable -tól , itt felül kell bírálnunk a hívási metódust, amely a type argumentum által megadott típusú eredményt adja vissza. Ez a megközelítés sokkal kényelmesebb, mint a Runnable felület futtatási metódusa, amely void értéket ad vissza. Néha a fejlesztőknek elő kellett állniuk különféle megoldások a szál eredményének eléréséhez."

"Látom."

"És most nézze meg, hogyan működik együtt a Callable a ThreadPoolExecutorral:

"Először is, a ThreadPoolExecutor osztály küldési metódusa egy paraméterezett Future objektumot ad vissza. Ezzel az objektummal megtudhatja, hogy egy feladat befejeződött-e, és megkapja az eredményt."

"Íme, hogyan működik:"

Példa
// 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();

"Távol! Különösen szeretem a Future osztályt. Milyen módszerei vannak?"

"Íme a legérdekesebbek:"

Módszer Leírás
boolean cancel(boolean mayInterrupt);
Leállítja a feladatot.
boolean isCancelled();
Igaz értéket ad vissza, ha a feladatot leállították.
boolean isDone();
Igaz értéket ad vissza, ha a feladat végrehajtása megtörtént.
V get() throws InterruptedException, ExecutionException;
Visszaadja a hívási metódus eredményét, vagy kivételt dob, ha előfordult.

"Csodálatos! Így a feladatokat is leállíthatod."

"Ne támaszkodjon túlságosan erre – nem minden szál állhat le. De ha egy feladat még mindig a sorban van, akkor ez jól fog működni."

"Szeretem ezt a megközelítést. Sokkal kényelmesebb, mint saját maga létrehozni szálakat, majd megpróbálni eredményt kihozni belőlük."

– Remek. Ma itt véget is érünk.