لمحة جافاوية 63: الحواجز

السلام عليكم

كيف حالكم يا شباب؟
لدي موضوعين للمقدمة اليوم الأول عن الشباب فاقد الحياء الذي يطلب منك الماء في المرافق بعد أن تشتريه مباشرة
الثاني احم احم نسيته
وبما أني نسيته إذن فنحن مضطرون على المقدمة الأولى
(ما رأيك لو تدخل في الموضوع مباشرة)
يصعب علي هذا يا أخ عبده
ضروري أن أمارس طقوسي الخاصة بالتدوين وإلا فقدت الشهية للكتابة
(وهو المطلوب :) )
خبيث كعهدي بك يا عبده
على كل سأحكي لكم القصة سريعاً بدون تعليقاتي وتعليقات الأخ عبده
كنا أن وصديقين لي جالسين في مرفق عام (الجندي المجهول بغزة)
تعرفون الدنيا حر بشكل خيالي ونحن بشكل أو بآخر لم نخطط لطلعتنا هذه
على كل قمنا بشراء زجاجة مياه معدنية
مر بنا مجموعة من الشباب يتسوقون أو يقومون بعمل لا أدري كنهه
ونحن نفتح زجاجة الماء ونصب منها لنشرب
فطلبوا منا الماء فقام صديقي بإعطاء الزجاجة لأحدهم
فصب في إحدى الكاسات البلستيكية التي أحضرناها لنشرب فيها
وأبقى الزجاجة في يده
فلما انتهى أخذ كأساً وآخر وصب لصيدقه

لو كانت النظرات تحرق لحرقتهم نظراتي
سبحان الله يا أخي
أولاً نحن اشترينا زجاجة الماء بنقودنا لو كنا جئنا بالماء من بيتنا لقلنا لا مشكلة فهم لا يعترفوا بصلاحية الماء للشراء أو ربما يروا أن سعر الماء المعدني مرتفع الثمن
أما وقد اشترينا نحن زجاجة الماء وهي ليست بباهظة الثمن ويهيأ لي أنهم ليسوا بفقراء حتى لا يشتروا واحدة فطلبهم الماء مرفوض
ثانياً نحن كنا نشرب من الماء عندما طلبوا أن نسقيهم فلربما نحن ظمآنون لدرجة أننا سننهي الزجاجة وربما كنت سأتقبل الأمر لو كانت الزجاجة موضوعة ولا أحد يشرب منها
ثالثاً شرب وأبقى الزجاجة في يده على أساس أننا فتحناها سبيلاً مثلاً أو أنهم مثلاً طلبوا منا الماء للمجموع
لم ينقصهم سوى أن ياخذوا الزجاجة معهم ويرحلوا
لولا بقية من حياء لأسمعتهم كلمتين قبيحتين وأخذت الزجاجة منهم

على كل دعوكم من زجاجة الماء التي تجعل الناس يكرهون بعضهم
ولنعود إلى موضوعنا
اليوم نتكلم عن أسلوب جديد للتزامن
أسلوب الحاجز
هذا الأسلوب يعتمد على القيام بوضع حاجز لمجموعة من الخيوط التي تعمل على التوازي
بحيث لا يتجاوز أحد الخيوط هذا الحاجز لوحده
ويشترط لتجاوز الحاجز أن يصل جميع الخيوط إلى الحاجز
عندها يمكن للجيمع اجتيازه معاً
عدا عن ذلك فإن الخيط يتوقف عن العمل بمجرد وصوله إلى الحاجز
متى نستخدم هذا الأسلوب؟
هذا الأسلوب بسيط المعنى سهل الإدراك
يمكننا القول بأنه أساسي عندما نتكلم عن عمل يقوم به مجموعة من العمال worker
كل عامل لديه مهمة يقوم بها
بدون أن ينتهي العمال جميعاً من مهمتهم لا يمكننا أن نقول بأن العملية انتهت
مثال ضرب مصفوفتين دعنا نقوم بها بأكثر من خيط
بحيث يقوم كل خيط بضرب صف من المصفوفة الأولى في جميع الأعمدة في المصفوفة الثانية
لا يمكننا القول بأن العملية الضرب تمت ونعيد المصفوفة للمستخدم ما لم يتم جميع العمال مهماتهم
أحياناً ممكن أن يستخدم هذا الأسلوب لضمان الحد الأدنى من الإنجاز
نأتي الآن إلى توضيح آلية الأمر في الجافا
الجافا توفر فئة اسمها CyclicBarrier
هذه الفئة تمكنك من عمل الحاجز الخاص بك ببساطة
كل ما عليك هو ان تقوم بإنشاء كائن من هذه الفئة

CyclicBarrier barrier = new CyclicBarrier(noOfThreadsReachBarier);

noOfThreadsReachBarier تمثل عدد الخيوط الذين يجب أن يصلوا إلى الحاجز حتى يتم الإفراج عن جميع الخيوط
بعد هذا يجب على كل خيط أن يقوم بمناداة الدالة await

try {
	barrier.await();
} catch (InterruptedException e) {
	e.printStackTrace();
} catch (BrokenBarrierException e) {
	e.printStackTrace();
}

بمجرد أن يقوم الخيط بمناداة هذه الدالة يتوقف الخيط عن العمل في انتظار اكتمال العدد
وعندما ينكتمل العدد يتحرر الجميع ويواصلون القيام بنشاطهم
لتوضيح الفكرة بصورة أفضل
قمت بعمل مثال على الموضوع
لن أشرح المثال لكنه كافي لتوصيل الفكرة بشكل أفضل للمبتدئين
المثال يقوم بتشغيل أكثر من عامل
يقوم كل عامل بتولي أمر سطر من الملف ويقوم بأخذ أول حرف من كل كلمة في السطر
في النهاية يتم طباعة النتائج كلها

package com.modonatalaa.freehostia.tips;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class FileWorker implements Runnable {
	private File file;

	public FileWorker(File file) {
		super();
		this.file = file;
	}

	public void run() {

		BufferedReader reader;
		try {
			ArrayList lines = new ArrayList();
			ArrayList statmentWorkerts = new ArrayList();
			reader = new BufferedReader(new FileReader(file));
			String line;
			while ((line = reader.readLine()) != null) {
				lines.add(line);
			}
			CyclicBarrier barrier = new CyclicBarrier(lines.size() + 1);
			for (String string : lines) {
				StatmentWorker statmentWorker = new StatmentWorker(barrier,
						string);
				new Thread(statmentWorker).start();
			}
			try {
				barrier.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				e.printStackTrace();
			}
			for (StatmentWorker statmentWorker : statmentWorkerts) {
				System.out.println(statmentWorker.getResult());
			}

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		new Thread(new FileWorker(new File("")));
	}
}
package com.modonatalaa.freehostia.tips;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public class StatmentWorker implements Runnable {
	private CyclicBarrier barrier;
	private String statment;
	private String result;

	public StatmentWorker(CyclicBarrier barrier, String statment) {
		this.barrier = barrier;
		this.statment = statment;
	}

	public void run() {
		StringBuilder resultBuilder=new StringBuilder();
		int start=0;
		while((start=statment.indexOf(' ',start))!=-1){
			start++;
			resultBuilder.append(statment.charAt(start));
		}
		setResult(resultBuilder.toString());
		try {
			barrier.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
	}

	public String getResult() {
		return result;
	}

	private void setResult(String result) {
		this.result = result;
	}

}

تحياتي

المراجع:
1- docomentation of CyclicBarrier class

Tags: , , , , , , , , ,

6 Responses to “لمحة جافاوية 63: الحواجز”

  1. abuouf قال:

    لا تنسي حديث من اسقي الكلب ودخل الجنة
    اعرف ان الكلب كاد يموت ولكن كن متسامحا:)
    درس جيد وفكرة جيدة شكرا لك
    وربنا يوفقك

  2. admin قال:

    يا عبد الله قلة الذوق هي المشكلة
    لا أكثر ولا أقل

    على كل منور يا عم الحج
    بالمناسبة لم نعد نراك في الجافا هل هجرتنا :(

  3. abuouf قال:

    بصراحة كنت هجرت الجافا وذهبت للكيوتي
    ثم عدت مرة اخري منذ ايام ولكن لجافا اندرويد :)
    لا استطيع هجرتكم وان حدث وهجرت الجافا فلا يمكنني ان انساك
    دمتم بود

  4. admin قال:

    بفكر أخوض البحر ده
    بس لسه مش شايفله سوق في البلد :)
    ايش معنى مثلاً يا عبد الله؟

  5. abuouf قال:

    اسف علي التاخر في الرد
    مبيحتجش يكون له سوق في بلدك انت بتعمل البرامج وتحطها علي اندرويد ماركت وتنشر انت اللينك وإلي بينزل البرامج بيدفع عن طريق الفيزا وبتوصلك علي حسابك
    بس بتدفع لكل برنامج بتحطه 25 دولار
    لحد دلوقتي مطلعتش ولا برنامج علشان انشغلت في الدراسة
    اول ما اطلع واحد هبعتهولك

  6. admin قال:

    العمل في هذا المجال قد يكون جيد
    لكني مشغول مع مواضيع الماجستير
    يبدو أني أحتاج إلى بعض الوقت حتى أتمكن من ملاحقة هذه التكنولوجيا

    تحياتي

Leave a Reply