در این قسمت تیم کدگیت را با آموزش Callable در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است:
Callable Interface
در آموزشهای گذشته، Thread را تعریف و مثالهای متنوعی در این حوزه زدیم. در تمامی مثالهای گذشته از کلاس Thread یا اینترفیس Runnable استفاده شد. نکته ای که در تمامی این مثالها نهفته بود، Thread و Runnable مقداری را برنمیگردانند. از نسخه پنجم جاوا، دو Interface به نام Callable و Future تعریف شدند که با همکاری هم، مقداری را از یک Thread برمیگردانند.
اگر کلاسی، اینترفیس Callable را implements کند میتواند به Threadpool اضافه شود. Callable متدی به نام Call دارد که شبیه به متد Run در Thread است. دو تفاوت عمده متد Run و Call را میتوان بازگردانی مقدار و Thrown Exception دانست (هر دو ویژگی در متد Run وجود ندارد).
وقتی یک Callable را به threadpool میدهیم یک شی از جنس اینترفیس Future باز میگرداند. این شی شبیه به Thread است و به ما اطلاع میدهد که چه موقع Callable ما مقداری را باز میگرداند.
مثال Callable در جاوا
کلاسی به نام Processor داریم که Callable را implements کرده است. این کلاس یک عدد به عنوان id دریافت کرده و بعد از گذشت 1 ثانیه Id را به عنوان یک رشته برمیگرداند. کد Callable در جاوا به صورت زیر است:
public class Processor implements Callable<String> {
private int id;
public Processor(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
Thread.sleep(1000);
return "ID: "+id;
}
}
تست Callable در جاوا
برای تست کد بالا،کد Main زیر راب بزنید:
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
List<Future<String>> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
Future<String> future = executor.submit(new Processor(i + 1));
list.add(future);
}
for (Future<String> future : list) {
try {
System.out.println(future.get());
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
executor.shutdown();
}
در کد بالا یک Threadpool ایجاد کردیم. یک Arraylist نیز ساختیم از جنس Future. در Future مقدار بازگشتی هر Processor ذخیره میشود. در آخر یک حلقه For نوشتیم که مقادیر Future را چاپ کند.