java, جاوا, همزمانی در جاوا (MultiThreading)

thread pool در جاوا (MultiThreading in Java)

Thread pool در جاوا

در این آموزش تیم کدگیت را با آموزش thread در جاوا همراهی کنید.  در آموزش قبل به معرفی synchronized و مشکل thread در به اشتراک قرار دادن یک متغیر پرداختیم. این جلسه به توضیح thread pool در جاوا خواهیم پرداخت. پیش نیازهای این آموزش:

  1. Thread در جاوا
  2. synchronized

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();




     }

}

کد بالا تقریبا همه آن آموزش داده شده به جز دو متد:

  1. shoutdoun: این متد به executor اطلاع میدهد که اصطلاحا خاموش شود و دیگر thread را نپذیرد ولی آن threadهایی که قبل از shoutdown اضافه شدند به کار خود ادامه میدهند تا موقعی که تمام شوند.
  2. Execute: یک thread را میسازد و به thread pool اضافه میکند برای اجرا شدن.

برنامه بالا دو thread را میسازد و همزمان اجرا میکند. قبل ما مسئول شروع thread و کنترل آن بودیم ولی الان thread pool این کار را برای ما انجام میدهد. خروجی برنامه چاپ نام threadهای در حال اجرا است. هر thread به تعداد 10000 بار نام خود را چاپ میکند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *