در این آموزش تیم کدگیت را با آموزش thread در جاوا همراهی کنید. در آموزش قبل به معرفی synchronized و مشکل thread در به اشتراک قرار دادن یک متغیر پرداختیم. این جلسه به توضیح thread pool در جاوا خواهیم پرداخت. پیش نیازهای این آموزش:
Thread pool در جاوا
در آموزش های قبل یک thread ساختیم.و نشان دادیم چطور یک task(عملیات) را با استفاده از Runnable در جاوا پیاده سازی میکنند.
Thread th1 = new Thread(new Runner());
th1.start();
روش گفته شده برای تک task (عملیات) مناسب است ولی برای تعداد بالای thread به هیچ عنوان مناسب نیست فرض کنید بخواهید 100بار thread را اجرا کنید باید 100 بار thread را به صورت جداگانه اجرا کنید!!! شروع یک thread جدید برای هر کار(task) می تواند محدودیت و باعث عملکرد ضعیف شود. استفاده از thread pools، یک راه مناسبی است برای مدیریت چند thread، که میخواهند همزمان اجرا شوند.(pool به معنی استخر است پس thread pool معنای استخری از thread میدهد)
جاوا برای اجرای thread در thread pool یک interface معرفی کرده است به نام Executor. برای مدیریت threadها یک interface دیگری معرفی کرده است به نام ExecutorService.
برای ساخت Executor از متد Executors که Static هم است استفاده میکنند.متد (newFixedThreadPool(int برای ساخت تعداد ثابت thread در thread pool استفاده میشود.
ExecutorService executor = Executors.newFixedThreadPool(2);
در بالا ما یک thread pool ساختیم که دارای دو thread است. در زیر یک مثال از thread pool آمده است.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestThreadPools {
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("thread 1");
}
}
});
executor.execute(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
System.out.println("thread 2");
}
}
});
executor.shutdown();
}
}
کد بالا تقریبا همه آن آموزش داده شده به جز دو متد:
- shoutdoun: این متد به executor اطلاع میدهد که اصطلاحا خاموش شود و دیگر thread را نپذیرد ولی آن threadهایی که قبل از shoutdown اضافه شدند به کار خود ادامه میدهند تا موقعی که تمام شوند.
- Execute: یک thread را میسازد و به thread pool اضافه میکند برای اجرا شدن.
برنامه بالا دو thread را میسازد و همزمان اجرا میکند. قبل ما مسئول شروع thread و کنترل آن بودیم ولی الان thread pool این کار را برای ما انجام میدهد. خروجی برنامه چاپ نام threadهای در حال اجرا است. هر thread به تعداد 10000 بار نام خود را چاپ میکند.