لمحة جافاوية 25: المساجين الخيوط والسجانين الكائنات

السلام عليكم

بعد طول تسويف
لمدة تجاوزت الشهر تقريباً
قرأت البؤساء للأخ فيكتور هوغو
بصراحة رواية جميلة جداً
تعالج أكثر من قضية
وتتحدث عن أكثر من طبقة
عشت في جو الرواية كأني بطلها
أحببت فيها شخصية جان فالاجان
الشخصية البطلة
وشخصية فالنتين الأم الرؤوم
وكرهت فيها الزوجين أصحاب الحانة
(نسيت أسمائهم يبدو لي أني
لن أكف عن ممارسة عادة النسيان
مع أني أعتقد أنها عادة سيئة لكن الطبع يغلب التطبع)
المهم أنها رواية جديرة بالقراءة
حاولوا أن تقرؤوها إن سنحت لكم فرصة
بما أن الموضوع يتكلم عن السجن
كان يجدر بي أن أكتب عن رواية الجريمة والعقاب
ربما كان جاك السفاح محبباً لدى الأطفال
لكني أحب الفلسفة بطبعي
دعونا نتحدث عن موضوع التدوينة
في جافا هناك فئة class رئيسية ترثها inheretence جميع الفئات
والتي هي الفئة كائن Object class
هذه الفئة تحتوي على عدة دوال methods
من هذه الدوال wait, notify and notifyAll
والتي هي الموضوع الرئيسي في كلامنا اليوم
لكل كائن في جافا سجن lock خاص به
هذا السجن يضع فيه الخيوط قليلة التهذيب
التي تنادي دالة wait الخاصة به
دالة wait تعني أن الكائن غير جاهز لتنفيذ ما بعدها
وعلى هذا يجب على الخيط أن ينتظر حتى يكون جاهز
متى سيكون جاهز؟؟
ستنتظر أن يتم مناداة دالة من الدالتين notify أو notifyAll

نختم بمثال وشرحه
المثال لمشكلة المنتج والمستهلك Producer-Consumer
نقلته كما هو من موقع صن كما هو
هذه الفئة التي ينتجها المنتج المنتج ليستهلكها المستهلك

    public class Drop {
        //Message sent from producer to consumer.
        private String message;
        //True if consumer should wait for producer to send message, false
        //if producer should wait for consumer to retrieve message.
        private boolean empty = true;

        public synchronized String take() {
            //Wait until message is available.
            while (empty) {
                try {
                    wait();
                } catch (InterruptedException e) {}
            }
            //Toggle status.
            empty = true;
            //Notify producer that status has changed.
            notifyAll();
            return message;
        }

        public synchronized void put(String message) {
            //Wait until message has been retrieved.
            while (!empty) {
                try { 
                    wait();
                } catch (InterruptedException e) {}
            }
            //Toggle status.
            empty = false;
            //Store message.
            this.message = message;
            //Notify consumer that status has changed.
            notifyAll();
        }
    }

هذا الخيط الخاص بالمنتج

    import java.util.Random;

    public class Producer implements Runnable {
        private Drop drop;

        public Producer(Drop drop) {
            this.drop = drop;
        }

        public void run() {
            String importantInfo[] = {
                "Mares eat oats",
                "Does eat oats",
                "Little lambs eat ivy",
                "A kid will eat ivy too"
            };
            Random random = new Random();

            for (int i = 0; i < importantInfo.length; i++) {
                drop.put(importantInfo[i]);
                try {
                    Thread.sleep(random.nextInt(5000));
                } catch (InterruptedException e) {}
            }
            drop.put("DONE");
        }
    }

هذا الخيط الخاص بالمستهلك

    import java.util.Random;

    public class Consumer implements Runnable {
        private Drop drop;

        public Consumer(Drop drop) {
            this.drop = drop;
        }

        public void run() {
            Random random = new Random();
            for (String message = drop.take(); ! message.equals("DONE");
                    message = drop.take()) {
                System.out.format("MESSAGE RECEIVED: %s%n", message);
                try {
                    Thread.sleep(random.nextInt(5000));
                } catch (InterruptedException e) {}
            }
        }
    }

وهذه الفئة الرئيسية

public class ProducerConsumerExample {
    public static void main(String[] args) {
        Drop drop = new Drop();
        (new Thread(new Producer(drop))).start();
        (new Thread(new Consumer(drop))).start();
    }
}

إذا أراد المنتج الإنتاج والمستهلك لم يقوم بالإستهلاك
فسيتوقف الخيط المنتج بواسطة جملة wait في الدالة put
في حالة قام المستهلك بإستهلاك المنتج السابق فسيتم تحرير الخيط الخاص بالإنتاج من سجنه
وسينتقل إلى مرحلة العمل عن طريق الدالة notifyAll في الدالة take
إذا أراد المستهلك الإستهلاك والمنتج لم يقوم بالإنتاج
فسيتوقف الخيط المستهلك بواسطة جملة wait في الدالة take
في حالة قام المنتج بإنتاج منتج جديد فسيتم تحرير الخيط الخاص بالإستهلاك من سجنه
وسينتقل إلى مرحلة العمل عن طريق الدالة notifyAll في الدالة put

المراجع:
1- مقال بعنوان Guarded Blocks في دروس صن
http://java.sun.com/docs/books/tutorial/essential/concurrency/guardmeth.html
2-مقال بعنوان Multithreaded Programming, درس بسيط للمبتدئين
للأخ وجدي عصام في منتديات الفريق العربي للبرمجة
http://www.arabteam2000-forum.com/index.php?showtopic=161008

تحياتي

Tags: , , , , , , , , , , , , ,

3 Responses to “لمحة جافاوية 25: المساجين الخيوط والسجانين الكائنات”

  1. chinaman قال:

    Hi
    You shoud be the journalist with your nice talent

  2. admin قال:

    موهبة؟؟؟
    في الغالب أنا سيء جداً وإلا كنت ستراني في أوائل أصحاب المواقع

    تحياتي

  3. […] ولا تستخدم 4- لمحة جافاوية 23: مشاكل الخيوط في جافا 5- لمحة جافاوية 25: المساجين الخيوط والسجانين الكائنات 6- لمحة جافاوية 39: نصيحة 7- لمحة جافاوية 49 حاوية الخيوط […]

Leave a Reply