
– 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:"
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:"
// 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 |
---|---|
|
Leállítja a feladatot. |
|
Igaz értéket ad vissza, ha a feladatot leállították. |
|
Igaz értéket ad vissza, ha a feladat végrehajtása megtörtént. |
|
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.
GO TO FULL VERSION