من العنوان ، نقاش عام ، سؤال ، طرح رأي ، مثال ، كل ماتريدون
هذا الموضوع قد لايحتوي على رد واحد ، وقد يحتوي على 100 رد
انتظركم
Ooh ! :blink:
من العنوان ، نقاش عام ، سؤال ، طرح رأي ، مثال ، كل ماتريدون
هذا الموضوع قد لايحتوي على رد واحد ، وقد يحتوي على 100 رد
انتظركم
Ooh ! :blink:
يبدو انني اصبحت مكروهاً لدرجة ان لاأحد لديه زمام المبادره
:unsure:
طيب بما أن الأمر مجرد نقاش فأنا أبي أطرح تساؤلات كثيرة تقابلني في البرامج اللي أسويها دائماً .
1) وش الحد الفاصل بين إسراع عمل البرنامج وبين زيادة الجهد على البرنامج ؟ أقصد لو عندي برنامج وأحتاج أن أستخدم 10 إلى 15 من الThread في وقت معين فقط . هل تكوين 10 من Thread سيكون جيد (thread لكل دالة مثلاً ) . أم أكون 5 من thread بحث أدمج عمل دالتين في thread واحد . هل تكوين 10 من thread دفعه واحده سيأثر في سرعة البرنامج .
2) هل الأفضل تكوين thread عند الحاجة له . أما تكوينه في وقت سابق (مثلاً عند بدأ البرنامج ) ومن ثم تشغيله عند الحاجة له (start).
{عيسى} كتب:يبدو انني اصبحت مكروهاً لدرجة ان لاأحد لديه زمام المبادره:unsure:
دخلت على الموضوع وكتبت رد لكن
شكلي بطئ في كتابت الردود :)
قبل ما نجاوب على اسئلتك - وعشان ما يزعلش عيسى - احببت ان اضع مقدمة صغير عن الموضوع قبل الدخول في الشرح
ما هو الــ Thread ؟
الثريد عبارة عن مهمة او وظيفة ممكن ان تعمل مع بعض بالتوازي Parallel
الجافا تستخدم الثريد في مواضع مثل:
1. Garbage collection : الذي يعمل في الخلفية لتوفير المساحة في الذاكرة.
2. الاحداث التي تحدث على الـ GUI مسئول عن تجميعها ثريد يعمل في الخلفية
الثريد يظهر وكانه يستخدم الـ Resources الخاصة به مثل CPU,Memory, Registers لكن مع مشاركة المتغيرات .
عادة الثريد يطلق عليه اسم Light Weight Process (LWP) لانه ينفذ مهمة تماما مثل الـ Process ولكن عادة تكون خفيفة
امثلة على استخدام الثريد :
من اوضخ الامثلة متصفح الانترنت نلاحظ مثلا ان المتصفح يحمل اكثر من صورة في نفس الوقت وذلك لان كل ثريد مسئول عن تحميل صورة مختلفة
ايضا نلاحظ ان النص يبدا بالظهور في نفس الوقت الذي تظهر فيه الصور وذلك لان هناك ثريد مسئول عن تحميل و عرض الـ HTML
ايضا تجد هناك تريد مسئول عن المدخلات من المستخدم..
تخيل حياتك من غير ثريد سوف تتطر الى انتظار كل صورة على حدة ثم ظهور النص و هكذا!
الـ JVM (multithreaded ) نفسها تستخدم الثريد فهي تشغل الثريد المسئول عن Garbage collection و ثريد المسئول عن تحديث GUI و ثريد لبرنامجك الذي يعمل تحت JVM
نستكمل ان شاء الله
منقطع من حين لاخر
ooh
أولاً لست متخصص في Threading in Java ( بالمناسبه هذا عنوان كتاب )
اقتباسوش الحد الفاصل بين إسراع عمل البرنامج وبين زيادة الجهد على البرنامج ؟ أقصد لو عندي برنامج وأحتاج أن أستخدم 10 إلى 15 من الThread في وقت معين فقط . هل تكوين 10 من Thread سيكون جيد (thread لكل دالة مثلاً ) . أم أكون 5 من thread بحث أدمج عمل دالتين في thread واحد . هل تكوين 10 من thread دفعه واحده سيأثر في سرعة البرنامج .
برأيي الشخصي تعتمد ماهو عمل ال10 Threads هذي
كل الذي أعرفه بأنك تستطيع عمل management للthreads عن طريق الاولويه حقتها ، مثلاً عندك thread A تاخذ وقت طويل من Processing
بالتالي يجب ان تضع لها priority قليله MIN_PRIORITY ، حتى يتفضالها الـCPU بعد اكمال جميع threads الاخرى
اقتباس2) هل الأفضل تكوين thread عند الحاجة له . أما تكوينه في وقت سابق (مثلاً عند بدأ البرنامج ) ومن ثم تشغيله عند الحاجة له
لاأدري ولكن غالباً عندما تعمل أكثر من thread فبالغالب انت تريد أن تعمل بينهم concurrency مثل thread A تجعل thread B في الwaiting list او
thread A ترتبط بمتى مانتهت thread B ،
أخي b.m.s غالبية هذه الأمور هي JVM specification , ان كنت تريد ان تتعمق أبحث عن Java Language Specification
أخوي عيسى جزاك الله خيراً على الرد والمعلومة المفيدة عن أولوية الthreads . وبأبحث عن هذا الكتاب وأقرأه إن شاء الله .
وهذه معلومة مفيدة في الإستخدام الأمثل للThread . وهو إنه من الإصدار الخامس للJ2SE يفضل تكوين thread عن طريق تطبيق (implement) لل Runnable Interface. مثال :
public class MyThread implements Runnable
{
public void run()
{
System.out.printf("Hello Thread");
}
}الآن أصبح لديك كائن يحتوي على خاصية أنه يمكنه العمل لوحده بدون ما يزعج النظام :) . طيب السؤال كيف أستخدم هذا الكائن لأنه لا يحتوي على دالة start ؟
الجواب بسيط وهو عبر إستخدام الExecutors والExecutorService . وهذا مثال يوضح الطريقة :
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class MainThread
{
public static void Main(String [] args)
{
MyThread thread1 = new MyThread1();
MyThread thread2 = new MyThread1();
ExecutorService threadExecutor = Executors.newFixedThreadPool( 2 );
threadExecutor.execute(thread1);
threadExecutor.execute(thread2);
threadExecutor.shutdown();
}
}والشرح سيكون كالتالي
MyThread thread1 = new MyThread1(); MyThread thread2 = new MyThread1();
وهو في البداية تم تكوين كائنين من MyThread .
ExecutorService threadExecutor = Executors.newFixedThreadPool( 2 );
وهنا تم طلب من Executors أن يحجز لنا خانتين للthread اللي سويناه
threadExecutor.execute(thread1); threadExecutor.execute(thread2);
وبعد ذلك تم طلب تنفيذ هذه الthreads من threadExecutor
threadExecutor.shutdown();
وآخيراً تم إغلاقهما
توجد مواضيع شيقة في الthread خصوصاُ عن كيفية عمل synchronize لها وأيضاً يوجد شئ إسمه Callable ممكن أحد يتحفنا بمعناها وفائدته لأني قرأت أحد الكتب يتكلم عنه وما فهمته بالحيل :)
تم تعديل هذه المشاركة بواسطة b.m.s في 26 أبريل 2007 في 16:28
ooh
b.m.s انت بصراحه رائع ، هذا ماكنت أريده ، Executors & Callabe توني اعرفهم ، شي جميل جداً
فعلاً انا كنت متوقع ان فيه Thread boolفي الجافا مثل مافي للString bool (وكأني لمحتها زمااان)
هل بامكانك تخبرنا كيف thread bool أقصد ماهية عمله ؟
بارك الله فيك اخوي جاري البحث عن callabe ، ولكن مالفرق بين ان تعمل instantiation من Thread Object وبين ماقلته ، بالأصح
مالفرق بين :
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class MainThread
{
public static void Main(String [] args)
{
MyThread thread1 = new MyThread1();
MyThread thread2 = new MyThread1();
ExecutorService threadExecutor = Executors.newFixedThreadPool( 2 );
threadExecutor.execute(thread1);
threadExecutor.execute(thread2);
threadExecutor.shutdown();
}
}وبين
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
class MainThread
{
public static void Main(String [] args)
{
MyThread thread1 = new MyThread1();
MyThread thread2 = new MyThread1();
new Thread(thread1).start();
new Thread(thread2).start();
}
}حسب معرفتي (البسيطه) بأن في الجافا مهما عملت لابد أن تنشأ Thread Object من الكلاس Thread عندما تريد ان تنشأ thread جديد
هل هو ان الأول بواسطة pool والثاني بدون pool ?
مثل الفرق بين
class MainThread
{
public static void Main(String [] args)
{
String s="ooh";
String s2=new ("ooh");
}
}أتمنى تتحفنا بما تعرف ، ماعليش صعب اكتب b.m.s كل مره ، الاسم الاول لو سمحت :lol:
اختي الدكتوره ساره ،
هذا الموضوع كتبته للنقاش ، وكنت متوقع بأن يقول الاعضاء مثل ماقلتي
لست متخصص في Threading in Java لكن سأكتب موضوع للمبتدئين ، الموضوع المتقدم راح يكتبه ابو مازن :unsure:
ابو الفؤاد ، ناردين ، رامي ، ابو مازن ، مجدي ، finalHeaven ، Developer ، ali7878 ، yadoo
الجميع بلا استثناء مرحب به ، مو لازم تكتب شئ طويل عريض فقط اطرح تساؤلات او مقاله او ساعدنا بما يشكل علينا ،
هلا أخوي عيسى , معك أخوك بندر من الرياض (أسمي بندر وساكن بالرياض :lol: )
ال Thread pool يستخدم لإدارة مجموعة من الthread في البرنامج بحيث يخزن مجموعة من الthread الجاهزة وإذا إحتاج برنامج أي thread فإنه يسند أي thread موجودة عنده للي طلبه برنامجك .
فائدته : فيه فوائد كثيرة وهي إنه بدل ما تكوّن thread كل ما تحتاج له وتستغرق في عمليات كثيرة من تسجيل وغيرها وأيضاً تبعد عن الجهد (overhead) اللي راح يصبح على الذاكرة لأنك راح تكون thread جديد مع الstructure حقه وكل بياناته وإنتظر الGrabage Collection لين ما يصحى ويجيك :) ولا تنسى الschedule راح يحطه عندها - يعني شغلات كثيرة متعبة - . فقط ما تحتاج له هو إعادة إستخدام أحد الthread الموجودة عنده.
اقتباسهل هو ان الأول بواسطة pool والثاني بدون pool ?
مثل ما قلت B)
تم تعديل هذه المشاركة بواسطة b.m.s في 28 أبريل 2007 في 00:00
يعطيك العافيه بندر ، معك اخوك عيسى من الرياض - جامعة الهموم ، آخر ترم وربك يسهلها :lol:
هذا الموضوع مغلق.