Programming Basics SQL HTML CSS JavaScript Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Learn Typing

Javaمثال حول Thread Pool في جافا

في المثال التالي قمنا بإنشاء كلاس إسمه MyRunnable يطبق الإنترفيس Runnable.
بعدها فعلنا Override للدالة run() حتى نجعل أي كائن من الكلاس MyRunnable يطبع إسمه و عدد المرات التي تنفيذه فيها كل ثانية.

ثم قمنا بإنشاء كلاس إسمه Main, و الذي قمنا فيه بإنشاء كائن نوعه ExecutorService إسمه executor يمثل خمس نسخ من الكلاس Thread.

بعدها قمنا بإنشاء حلقة for تعيد تنفيذ الأوامر التي بداخلها خمس مرات.
في كل مرة سيتم جعل الكائنات الخمسة الموجودة في الكائن executor تمثل خمسة كائنات من الكلاس MyRunnable, و سيتم تشغيلهم مباشرةً.

لاحظ أنه عند تشغيل البرنامج سيقوم بخلق خمس كائنات Thread و تشغيل كل واحد فيهم ثلاث مرات.


MyRunnable.java
public class MyRunnable implements Runnable {
@Override
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 MyRunnable implements Runnable { @Override 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()); } } } }

Main.java
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();
}
}
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
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