إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

java threading

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • java threading

    Threading in java
    Why and How to use it
    بدون مقدمات
    طبعا خاضع للرخصه السفاحيه
    وطبعا اهداء ل "striker , sofy , ابو عبد الرحمن , ,CPU, grey , [email protected]"
    وكل الناس الي ذاكرتي لم تسعفني بيهم دلوقتي
    متطلبات : خلفيه في البرمجه بشكل عام
    وخلفيه في ال java بشكل خاص

    تخيل ان عندك برنامج معين بيؤدي عدة وظايف متتابعه بنفس النمط كل مره تشغله فيها
    تخيل ان مع مرور الوقت اصبح البرنامج بطئ ! وانت سمعت ان البروسيسور العادي بتاع الجهاز يقدر ينفذ اكتر من عمليه في نفس الوقت – لاحقا -
    قررت انك تكتب اكتر من برنامج وتربطهم ببعض بطريقة معقده من تصميمك بحيث انهم يتنفذوا مع بعض في نفس الوقت !
    بكده انت قدرت تعمل اكتر من عمليه – عمليه حقيقيه – وتنفذ اكتر من جزء في نفس الوقت

    طب تخيل معايا انك في نفس البرنامج تقدر تعمل نوع معين من العمليات – عمليات خفيفه – في نفس الاطار وبتتشارك مع بعضها في نفس البيانات الداخله والخارجه ونفس ال cpu ونفس ال address space وتقدر تتنفذ مع بعض في نفس الوقت – او كما يظهر انه في نفس الوقت -
    هو دوت ال Threading بالتحديد .
    لما بتعمل اكتر من thread البرنامج بتاعك بيكون اسمه MultiThreaded program يحتوي علي اكتر من Execution context والي هي عباره زي ماقلنا عن عمليات صغيره
    لكن اذاي بيتم تنفيذ ال Threads ديت ؟
    قبل مانبدأ نشرح طريقة التطبيق في ال java نبدأ اولا بشرح ال Threads بتشتتغل اذاي
    مبدئيا حط في اعتبارك ان ال Threads بتبقي داخل ال Process
    بتتشارك مع بعضها ببعض ال resources الموجوده بداخل ال Process
    بيتم نفيذها باستخدام نفس المبدأ الخاص بتنفيذ اكتر من عمليه في نفس الوقت عن طريق ال TDM
    شرح موجز : نوع معين من نقل البيانات رقميا بحيث ان تظهر البيانات وكأنها تنقل في نفس الوقت ولكن الحقيقه هي تنقل بالتتابع .
    البروسيسور بيستخدم المبدأ دوت في التعامل مع ال Threads بيحول ال context بتاعته من Thread للتاني بسرعه كبيره جدا بحيث تشعر انها تنفذ في نفس الوقت

    بالتالي البرامج في ال java كلها بتبدا من ال entry point التي تسمي main method – مبرمجين ال c بيقولوا الحمد لله دلوقتي صح :D – من main method كل حاجه بتبدا
    عشان برده تكون معايا في الصوره ال threads في ال java هي objects طبعا كل object لازم يكون ليه class وبالتأكيد ال class دوت user defined يعني انت الي بتحدده
    ال class دوت بيكون فيه method اسمها run وديت بالظبت شبه main في البرنامج الرأيسي
    هي ديت ال entry point بتاعت ال Thread
    بيتم استدعاء ال run method ديت عن طريق ال Thread wrapper !! لحظه ؟؟
    Thread wrapper ? بالتحديد هو دوت ال object الي بيحتوي علي ال خصائص بتاعت ال Thread والي حنقوم بشرحها مع الوقت
    ال Thread wrapper بنعمل منه Thread object وبيتم تمرير ال object الي احنا عملناه قبل كده الي موجود فيه run method
    ال Thread object بيحتوي علي عدة methods منهم start
    هي ديت المسؤله عن استدعاء ال run method في ال object الخاصه بينا
    وهدي ديت الي بتقوم بعمل separate thread of execution بتقوم بعمل Thread وبتقوم بتشغيل ال run method الموجوده في ال object بتاعنا في ال thread دوت
    لكن اذاي ال thread wrapper بيقدر يتعامل مع الانواع المختلفه من ال objects ؟
    ومنين يقدر يعرف ال object الممرر ليه نوعه ايه ؟
    في الحقيقه هو مش محتاج . لانه بيعتمد علي interface اسمها Runnable interface
    بتحتوي علي one method اسمها run
    بالظبط كده , وانت بتعملها override في ال class الخاص بيك
    وبالتالي ال Thread wrapper يقدر يتعامل معاها بكل حريه بدون وجع دماغ بال specifications الخاصه بأي class تاني , لان ال interface موجوده
    قبل ماناخد مثال لازم نشرح حاجه كمان ال threads اذاي بيتم التعامل معاها ؟
    عن طريق ال scheduler ودوت جزأ مهم جدا في اي Operating system
    لانه عن طريقه بيتم تحديد الاوقات وتنظيمها لكل ال processes الموجوده في ال System للحصول علي ال multitasking في processor واحد

    اول ما البرنامج بيبدا يشتغل بيتم عمل process جديده
    ثم يتم تشغيل main method بداخل ال process .. لاحظ thread
    ثم يتم عمل thread اخر بناء علي طلبك
    ويتم استدعاء start
    star بتبدأ تنفيذ run زي مانت عارف وعن طريق ال scheduler بيتم ابلاغه ان في thread عايز يتشغل
    يبدا ال scheduler بالانتباه لل thread دوت وياخده ويحطه في ال execution time في الوقت المناسب
    ويبدا ال run method في التنفيذ لكنن!
    تخيل معايا الاتي
    main method is updating user interface
    thread1 is reading from a socket but this socket has no data inside it yet ! ايه الي حيحصل ؟ حيتم عمل block لل thread دوت ويتم نقله لل blocked stat اول مايحصل ان في data حيتم نقل ال thread تاني لوضعية الانتظار ثم يتم تفعيل run ويبدا ال thread بانجاز مهمته وبعد ماينتهي من مهمته ايه الي بيحصل ؟ بيتم الغائه زيه زي اي process تانيه
    لاحظ نفس الكلام في main method اول مابتنتهي بيتم انهاء العمليه وحذفها
    ده بيحصل عشان يكون في فرصه تانيه لل threads الاخري انها تتنفذ
    ودوت طبعا كله بيتم عن طريق ال jvm

    كفايه كلام ونبدا التطبيق
    ده ال thread1 class وطبعا انت عارف انه لازم يكون بيدعم ال Runnable interface وبيكون محتوي علي run method
    كود PHP:
    Thread1.java//
    public class Thread1 implements Runnable {

       public 
    void run()
        {
            for( ; ;)
                
    System.out.println("Loop Thread ");
        }

    ثم نبدا في ال Main class الخاص بينا والي حنسميه program عشان سترايكر يبطل يقولي" Main ديت ال Main method بتاعت ال C# وبطل تستخدمها عشان بتلخبطني
    كود PHP:
    Program.java//
    public class Program {

     
        public static 
    void main(String[] args) {
           
            
    Run cont = new Run();
            
    int x 0;
            
    Thread thread = new Thread(cont);
            
    thread.setPriority(5);
            
    thread.start();
            
            
            while(
    true)
            {
                
    System.out.println("Program");
            }
            
        }


    لاحظ شيئ مهم جدا !
    ان ممكن ال thread يتنفذ الاول وممكن Program يتنفذ الاول
    وطبعا دوت ولتاني مره راجع لل ؟؟ scheduler
    ولاحظ انها حتطبع program اكتر من مره وبعدين thread اكتر من مره
    ومش في اي ضمان انهو يبدا الاول
    لاحظ معايا :
    public class Thread1 implements Runnable
    زي مانت شايف عامل implementing لل Runnable interface
    كود:
    public void run()
    over ride لل run method

    في ال Program.java
    كود:
    Run cont = new Run();
    لاحظ instance جديده من ال class اوبجكت جديد يعني
    Thread thread = new Thread(cont);
    لاحظ برده instance جديده من ال Thread wrapper class وتم تمرير ال cont الي يحتوي علي ال run method لل Constructor بتاع ال thread
    لاحظ
    كود:
    setPriority(5);
    ديت بتعمل تحديد لل priority بتاعت ال thread وانا خليتها 5 رقم جه في دماغي وخلاص حاليا ! "او بالتحديد لان ال main method لما جربت اجيب ال priority بتاعتها طلعت 5 في جهازي جرب عندك
    اذاي ؟؟ في اخر الموضوع حتعرف"


    واخيرا
    كود:
    thread.start();
    وبتبدا تنفيذ العمليه الي شرحناها من شويه صغيرين
    حاجه مهمه جدا , ان ال 2 threads دول مرتبطين ببعض
    يعني يقدروا يعملوا communication ببعض عن طريق مثلا method call لكن لازم يكون ال thread الي حتعمل communication معاه محدد , يعني instance محدد من ال execution
    وحيكون ال instance دوت هو ال class الذي يحتوي علي ال run method بتاعت ال thread الخاص بيك

    تخيل معايا الاتي -"مستوحاه بشكل كامل من ال Sun microsystem course “ يعني انا مش جايبها من دماغي -”البرنامج الاصلي بتاعك عايز يعد من 1ل2000
    مع وجود thread اخر بيطبع كلمات من وقت لاخر علي الشاشه ولتكن الكلمه Thread
    لكن بعد مابتخلص ال main method الشغل بتعها بيتم اغلاقها ولكن ال thread الاخر يظل فعال ويظل بمساحته موجود علي الشاشه !
    الحل ان تقوم بعمل تواصل معه قبل ان تقوم main method بإنهاء مهمتها وان تقوم بطلب اغلاق ال thread او انهاء مهمته !
    ولكن كيف
    عن طريق class اخر يحتوي علي ال instance التي تحتوي علي run method الي انت عايز تشغلها
    ويحتوي علي instance لل thread ذات نفسه بحيث انك تقدر تشغله وقت ماتطلب
    مثال
    كود PHP:
    //Control.java


    public class Control {
        
        
    Run miniProgram = new Run();
        
    Thread thread1 = new Thread(miniProgram);
        
        public 
    void startThread()
        {
            
    thread1.start();
            
        }
        
        public 
    void stopThread()
        {
            
    /* stopExecution on our Specific instance of
             * The Runnable class that we are Running right now
             * */
            
            
    miniProgram.stopExecution();
        }

    لاحظ معايا انه بيحتوي علي ال thread1 وهي instance لل Thread wrapper class ويحتوي علي miniProgram والي هي instance لل class الذي يحتوي علي ال run method الي انت عايز تشغلها
    كود PHP:
    Run.java 
    public class Run implements Runnable {

        
    boolean x true;
        
        public 
    void run()
        {
            while(
    x/* Will never stop Runing until x is false */
                
    System.out.println("Loop Thread ");
        }
        
        public 
    void stopExecution()
        {
            
    false/* Will stop the above loop */
        
    }

    لاحظ ان ال Thread عمره ماهينتي لان x is always true ! لكن لما بيتم استدعاء stopExecution بيتم وضع قيمة x علي انها false وبالتالي while(x) هيتم ايقافها ويتم ايقاف ال thread وانهاء ال run method !
    كود PHP:
    Main.java
    public class Main {

     
        public static 
    void main(String[] args) {
           
            
    int x 1;
            
    Control myMiniProgram = new Control();
            
    myMiniProgram.startThread();
            
            while(
    <= 2000)
            {
                
    System.out.println("Program "+x++);
            }
           
    /* If we don't put stopThread(); our Thread will never stop executing even 
            * though main has complete it's task and it's over
            * */
            
    myMiniProgram.stopThread();
        }


    لا موؤخذه ياحج سترايكر :P
    لاحظ instance جديده من Control class وطبعا انت عارف هو بيحتوي علي ايه
    الي يهمنا هو myMiniProgram.stopThread();
    لاحظ stopThread في ال control كلاس بيعمل ايه ؟؟؟
    بيعمل استدعاء لل stopExecution علي ال miniProgram الي شغال حاليا
    وكده عمل communication معاه وقاله STOP FUCKING AROUND
    لاحظ implements Rubbale كانت طريقه من طرق عمل new thread
    لكن انت تقدر تعمل direct inheritance لل Thread class كالاتي
    كود PHP:
    public class Main {

        private static class 
    hola extends Thread
        
    {
            public 
    void run()
            {
                
    System.out.println("WTF!");
            }
        }
        
        public static 
    void main(String[] args) {
           
            
    Thread x = new hola();
            
    x.start();
        }

    لاحظ طبعا ان علاقة ال inheritance هي is-a يعني hola ماهي الا thread
    لكن لاحظ انت كده عملت inheritance ل Thread class ومش حتقدر تعمل inheritance لاي class تاني
    فأكيد خلي بالك وانت بتعملها كده ,
    summery :
    Thread is another context of execution running on the same process space
    Scheduler is the os-part that controls multitasking
    Runnable:is the interface that makes a class supported to be a thread
    Thread wrapper: responsible of creating a new thread and start executing run method on that thread
    Thread controller : Is a user defined class that controls/communicate with the thread
    واخيرا نعرض بعض ال functions الخاصه بال thread wrapper class واهميتها

    كود PHP:
    activeCount(); 
    returns number of currently active threads in this thread's groub
    كود PHP:
    currentThread() 
    : a static method that returns a Thread object referring to the current executing thread
    كود PHP:
    getId() , getName getPriority 
    : Function returns id , name , Priority of it's thread
    example :
    كود PHP:
    Thread myMain Tread.currentThread();
    long x myMain.getId();
    String name myMain.getName();
    int x myMain.getPriority(); 
    كود PHP:
    setName() , setPriority() 
    : Functions sets name and priority of it's thread
    كود PHP:
    myMain.setName(“Ahmed”);
    myMain.setPriority(6); 
    PS: عشانك ديت ياسترايكر هاه يااخوانا سترايكر امبارح قالي انه بيكتب في بسكال اكتر من بايثون
    return of pascal monks
    BOOOF , I AM GONE
    Still , you gotta wait for my PRESENT :D
    C programming arabic Tutorial|Programming-fr34ks

  • #2
    اشكرك كل الشكر يا ستورم لان المواقع دي بحفظهاا ويمكن تنفعني يوم من الايام وتكون مصدر معلومه ..

    وبالنسبه للاخ سترايكتريش << خخخ مشاء الله صاير يكتب بسكال ... *_^

    Twitter
    : @Linux4SA

    تعليق


    • #3
      تشكر اخي ستورم على الموضوع المفيد ،،
      وبالرغم من اني صفر على الشمال في جافا ، الا انني استمتعت به كثيرا ،،

      تحيااااتي ،، وكثر من هذه المواضيع

      تعليق


      • #4
        ستورمى:شكرا على الإهداء ياحج ^_~
        عاجبنى والله انك فعلا بتجيب من الآخر وتنجز.. شكل الكورس جاب فايدة لسه عقبال ال J2EE:P
        مش اتكلمت عن ال Dead Locks وال Wait و Notify والكلام المكلبظ دا ؟ انا هعتبر دا Part 1 ياعم

        هو اى P.C هتفضل تطلعه كدا ؟ انسان فعلا مش بيتبل فى بقك line
        الرجالة بتاعت ال Pthreads اعتقد هيموتو من الحسد ههههههههههه

        * اذا عايز تعمل implement لل threading فى ال كلاس بتاعك استخدم ال Runnable interface افضل من انك تعمل extend والسبب بسيط انك مش محتاج غير انك ت override لل run method بدل ماتضيع فرصتك فى ال Inheritance إلا طبعا اذا عارف انت عايز تعمل إيه ^_^


        * انا مش بكتب ببسكال حاليا مجرد بنعش الذاكرة -داخل فى 100 سنة اهو-
        SudaNix: مستنين منك ال Threading and QT ^_^
        Programming-Fr34ks[dot]NET
        Ma Weblog
        ابدأ بتعلم Python | Ruby
        كتاب البايثون متوافر الآن
        لا اتواجد بهذا المنتدى ... للإتصال

        تعليق


        • #5
          تسلم ستورمي ...
          وحش ~_^
          GCS

          تعليق


          • #6
            المشاركة الأصلية بواسطة BAD3R مشاهدة المشاركة
            اشكرك كل الشكر يا ستورم لان المواقع دي بحفظهاا ويمكن تنفعني يوم من الايام وتكون مصدر معلومه ..

            وبالنسبه للاخ سترايكتريش << خخخ مشاء الله صاير يكتب بسكال ... *_^
            منور
            المشاركة الأصلية بواسطة SudaNix مشاهدة المشاركة
            تشكر اخي ستورم على الموضوع المفيد ،،
            وبالرغم من اني صفر على الشمال في جافا ، الا انني استمتعت به كثيرا ،،

            تحيااااتي ،، وكثر من هذه المواضيع
            ليك شوقه ياراجل ياطيب
            المشاركة الأصلية بواسطة StrikerX مشاهدة المشاركة
            ستورمى:شكرا على الإهداء ياحج ^_~
            عاجبنى والله انك فعلا بتجيب من الآخر وتنجز.. شكل الكورس جاب فايدة لسه عقبال ال J2EE:P
            مش اتكلمت عن ال Dead Locks وال Wait و Notify والكلام المكلبظ دا ؟ انا هعتبر دا Part 1 ياعم

            هو اى P.C هتفضل تطلعه كدا ؟ انسان فعلا مش بيتبل فى بقك line
            الرجالة بتاعت ال Pthreads اعتقد هيموتو من الحسد ههههههههههه

            * اذا عايز تعمل implement لل threading فى ال كلاس بتاعك استخدم ال Runnable interface افضل من انك تعمل extend والسبب بسيط انك مش محتاج غير انك ت override لل run method بدل ماتضيع فرصتك فى ال Inheritance إلا طبعا اذا عارف انت عايز تعمل إيه ^_^


            * انا مش بكتب ببسكال حاليا مجرد بنعش الذاكرة -داخل فى 100 سنة اهو-
            SudaNix: مستنين منك ال Threading and QT ^_^
            ههههههههههههههههههههه الكورس ظبتني الصراحه
            وبعدين لازم تكون ملتزم بعلاقه واحده مع لغه واحده
            اذاي جالك قلب تخون البايثون دانت كنت py fr34k ياراجل
            بالنسبه مش بيتبل في بقي لاين ال strings support عندي ضعيف
            بعمل leak دايما في ال buffer بتاعي
            المشاركة الأصلية بواسطة CPU مشاهدة المشاركة
            تسلم ستورمي ...
            وحش ~_^
            منور وليك وحشه كبيره
            BOOOF , I AM GONE
            Still , you gotta wait for my PRESENT :D
            C programming arabic Tutorial|Programming-fr34ks

            تعليق

            يعمل...
            X