الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

multi thread

بدأه ريحانة الاقصى في 7 أكتوبر 2010 · 10 رد · 716 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لو سمحتو ممكن مساعدة

ان طلب منا نكتب برنامج لحل مسالة على المسالك المتعددة

والمسالة هي consumer producer problem

المشكلة انو مش عارف من وين ابلش فيها

انا بتصور انو لازم اعمل الها اول كلاس ل consumer وكمان كلاس لproducerبس المشكلة انو طلب منا انو البيانات المشتركة تكون بمصفوفة والconsumer يغير قيمتها من 1 الى صفر producer من 0الى واحد

وكمان ما تم عملية الاضافة بنفس الوقت والاضافة من الاسفل

المشكلة عندي بعملية التزامن عشان ما اخليهم يعملو مع بعض

ممكن حد يساعدني كيف ابلش بالسؤال

ملاحظة هاذا ليس طلب حل لانو الحلول متوفرة بالنت لهاي لمسالة بس انا بطلب مساعدة

#2

سوالك غير واضح

اتمنى ان توضحى السوال اكتر

الى ذلك ما هى المكونات لكل من الـ consumer , producer class

لكن على كل حال

اتمنى ان هذه الروابط تفيدك

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html

http://download.oracle.com/javase/tutorial/essential/concurrency/procthread.html

Software Developer
Mahmoudkelany.com


 

#4
Mahmoud Kelany كتب:

شكرا جزيلا على المساعدة

فعلا استفدت من اللي اعطيتني اياه

انا هلا حليت السؤال بنسبة 80%

باقي علي اطبع المصفوفة النهائية بعد ما يتم عليها كل التغير بس مش عارف متى بيوقف ال thread

#5

الحمدلله :)

تمام

بالنسبه لسؤالك

امتى بتوقف الـ thread

اولا عندك فى الـ thread داله اسمها stop لا تستخدميها :lol: :lol:

انتى تعتقدى انى قولت لك الحل انا بس كنت بنبهك منها

انما الحل بتاع انك توقفى الـ thread

مثلا

الـداله run

المكتوب فيها الكود اكيد فيها loop

معظمنا بيعملها while loop

لكن الشرط دائما الكثير يعضه

public void run() {
 while (true) {
//code here
  }
}

ممكن انا بدل ما اجعل الـ while تعمل دائما

اجعلها تعمل عند صحه شرط معين

ازاى هى الـ true هذه من احد قيم الـمتغير boolean

يعنى اصنع متغير boolean

private boolean isRun = true;

public void run() {
  while (isRun) {
// code here
  }
}

وطبعا اذا عمل الـ thread خلاص سيظل شغال حتى انتهاء البرنامج

انما انا عاوز عند حدث معين اجعل الـ thread يقف

سهله بقا

اجعل الـ

isRun = false;

لم عملت انه false هيعمل فحص اثناء تشغيل الـ while loop هيجد ان الـ isRun = false

يقف على طول :D

عاوز اشغله تانى اجعل

isRun = true;

اتمنى ان تكون اتضحت :D

بالتوفيق :)

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 8 أكتوبر 2010 في 23:31

Software Developer
Mahmoudkelany.com


 

#6
Mahmoud Kelany كتب:

الحمدلله :)

تمام

بالنسبه لسؤالك

امتى بتوقف الـ thread

اولا عندك فى الـ thread داله اسمها stop لا تستخدميها :lol: :lol:

انتى تعتقدى انى قولت لك الحل انا بس كنت بنبهك منها

انما الحل بتاع انك توقفى الـ thread

مثلا

الـداله run

المكتوب فيها الكود اكيد فيها loop

معظمنا بيعملها while loop

لكن الشرط دائما الكثير يعضه

public void run() {
 while (true) {
//code here
  }
}

ممكن انا بدل ما اجعل الـ while تعمل دائما

اجعلها تعمل عند صحه شرط معين

ازاى هى الـ true هذه من احد قيم الـمتغير boolean

يعنى اصنع متغير boolean

private boolean isRun = true;

public void run() {
  while (isRun) {
// code here
  }
}

وطبعا اذا عمل الـ thread خلاص سيظل شغال حتى انتهاء البرنامج

انما انا عاوز عند حدث معين اجعل الـ thread يقف

سهله بقا

اجعل الـ

isRun = false;

لم عملت انه false هيعمل فحص اثناء تشغيل الـ while loop هيجد ان الـ isRun = false

يقف على طول :D

عاوز اشغله تانى اجعل

isRun = true;

اتمنى ان تكون اتضحت :D

بالتوفيق :)

شكرا جزيلا اتضحت

#7

يمكن ما فهمت علي منيح

انا ما بدي انا اوقف ال thread بدي اعرف متى هو بيخلص شغله

عشان اعرف وين احط كود طباعة المصفوفة النهائية

شكرا ع الاهتمام

#8
isAlive
#9

اوكي

بس وين احط هاد الامر

لانو اذا حطيتو في مكان ما انشئت الثريد بيطلعلي انو دائما aliveقصدي true

واذا حطيتو مكان runما بيتعرف عليه لانه انا منشئته بمكان تاني

جنني شو اعمل؟؟؟؟؟؟؟؟؟؟؟؟؟؟

#10

تلك الدالة لمعرفة حالة الـ thread فان كانت Alive النتيجة true والعكس

ستحتاجين أيضاً لإستعمال join

اقتباس

boolean isAlive()

Tests if this thread is alive.

void join()

Waits for this thread to die.

void join(long millis)

Waits at most millis milliseconds for this thread to die.

void join(long millis, int nanos)

Waits at most millis milliseconds plus nanos nanoseconds for this thread to die.

عليك عمل شئ كهذا

على إفتراض لدينا two threads وهما t1,t2 مثلاً

//code which creates and starts threads
try {
System.out.println("Waiting for threads to finish.");
t1.join();
t2.join();
...
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
if( !t1.isAlive()){
//your code
}
if( !t2.isAlive()){
//your code
}
...

يفضل إستخدام الكود بطربقة تتناسب مع الكود الخاص بك .

تم تعديل هذه المشاركة بواسطة YaSeenTA في 9 أكتوبر 2010 في 14:47

#11
ريحانة الاقصى كتب:

يمكن ما فهمت علي منيح

انا ما بدي انا اوقف ال thread بدي اعرف متى هو بيخلص شغله

عشان اعرف وين احط كود طباعة المصفوفة النهائية

شكرا ع الاهتمام

ما مممكن عن طريق الـ isRun هذا

ممكن تعرفى اذا كان الخيط ينفذ الاوامر ام لا

يعنى لو true يقبى ينفذ

انما اذا كانت false يقبى خلص تنفيذ

هذا على افتراض ان الخيط لم يحدث له اى اعتراض او اى شىء

انما لمعرفه ان الخيط نفسه موجود بستخدمى داله isAlive()

وكما قال لكى اخى الكريم YaSeenTA

اقتباس
يفضل إستخدام الكود بطربقة تتناسب مع الكود الخاص بك .

لان هناك طرق عديده للتعامل مع الـ threads بتكون حسب المنطقية لكودك

بالتوفيق

Software Developer
Mahmoudkelany.com


 

مواضيع مشابهة