Javaمثال حول Thread Pool في جافا
في المثال التالي قمنا بإنشاء كلاس إسمه MyRunnable
يطبق الإنترفيس Runnable
.
بعدها فعلنا Override للدالة run()
حتى نجعل أي كائن من الكلاس MyRunnable
يطبع إسمه و عدد المرات التي تنفيذه فيها كل ثانية.
ثم قمنا بإنشاء كلاس إسمه Main
, و الذي قمنا فيه بإنشاء كائن نوعه ExecutorService
إسمه executor
يمثل خمس نسخ من الكلاس Thread
.
بعدها قمنا بإنشاء حلقة for
تعيد تنفيذ الأوامر التي بداخلها خمس مرات.
في كل مرة سيتم جعل الكائنات الخمسة الموجودة في الكائن executor
تمثل خمسة كائنات من الكلاس MyRunnable
, و سيتم تشغيلهم مباشرةً.
لاحظ أنه عند تشغيل البرنامج سيقوم بخلق خمس كائنات Thread
و تشغيل كل واحد فيهم ثلاث مرات.
public class MyRunnable implements Runnable { public void run() { // هنا قمنا بإنشاء حلقة تعيد تنفيذ ما بداخلها ثلاث مرات for (int i=1; i<=3; i++) { // الحالي و عدد المرات التي تم تنفيذه فيها Thread هنا سيتم طباعة إسم كائن الـ System.out.println(Thread.currentThread().getName() +", counter = "+ i); // بعدها سيتم إيقافه مدة ثانية واحدة try { Thread.sleep(1000); } catch(Exception e) { System.out.println(e.getMessage()); } } } }
public class Main { public static void main(String[] args) { // فقط executor يمكن الوصول إليهم من خلال الكائن Thread هنا قمنا بإنشاء 5 نسخ من الكلاس ExecutorService executor = Executors.newFixedThreadPool(5); // هنا قمنا بإنشاء حلقة تعيد تنفيذ ما بداخلها 5 مرات for (int i=1; i<=5; i++) { // و سيتم تشغيلهم MyRunnable كائنات من الكلاس executor هنا سيتم إعتبار الكائنات الخمسة الموجودة في الكائن executor.execute(new MyRunnable()); } // executor في الأخير سيتم إيقاف تنفيذ أوامر الكائنات الخمسة الموجودة في الكائن executor.shutdown(); } }
عند تشغيل البرنامج, نلاحظ أنه يطبع خمس أسطر كل ثانية.
pool-1-thread-2, counter = 1 pool-1-thread-4, counter = 1 pool-1-thread-1, counter = 1 pool-1-thread-3, counter = 1 pool-1-thread-5, counter = 1 pool-1-thread-2, counter = 2 pool-1-thread-5, counter = 2 pool-1-thread-1, counter = 2 pool-1-thread-4, counter = 2 pool-1-thread-3, counter = 2 pool-1-thread-4, counter = 3 pool-1-thread-3, counter = 3 pool-1-thread-1, counter = 3 pool-1-thread-5, counter = 3 pool-1-thread-2, counter = 3