لماذا يعمل سلسلة Java Through () فقط مع حد الوقت هنا؟
-
01-10-2019 - |
سؤال
أحاول التعرف على خيوط Java لـ SCJP وكان لدي سؤال.
في الكود المكتوب التي قمت بإنشائها ببساطة: اثنان من القائم عليهم مع تخزين بيانات شائع (صفيف) وطريقة كتابة () متزامنة لملئها بالبيانات تترك خطابًا متتاليًا كعلامة لكل عملية تشغيل (A و B) بالتسلسل .
أعلم أن الكود خشن ويمكن أن يكون مكتوبًا بشكل أفضل ، لكنني كنت أبحث عن أخلاقيات الخيوط.
حتى الآن عندما أقوم بتشغيله ، لا ينتهي أبدًا وتتوقف النتائج في:
لا تزال جيدة. A0.
ولكن عندما أقوم بتغيير الانتظار () للانتظار (100) ، فإنه يعمل بشكل جيد من 0 إلى 9 وينتهي بشكل طبيعي. هل يمكن لأحد أن يشرح السبب وراء ذلك بالنسبة لي من فضلك؟
شكرًا لك.
public class ArrayThreads {
Object[] array = new Object[10];
boolean isA = true;
int position = 0;
int getIndex(){
return position;
}
class ThreadA implements Runnable{
synchronized void write(String value){
while(!isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("A");}
}
}
class ThreadB implements Runnable{
synchronized void write(String value){
while(isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("B");}
}
}
public static void main(String[] args){
ArrayThreads threads = new ArrayThreads();
Thread threadA = new Thread(threads.new ThreadA());
Thread threadB = new Thread(threads.new ThreadB());
System.out.println("Still good");
threadB.start();
threadA.start();
}
}
المحلول
سلاسلك هي كل انتظار وإخطار كائنات منفصلة - لذلك لا تتواصل مع بعضها البعض على الإطلاق. إذا كنت تريد منهم إطلاق بعضهم البعض بشكل فعال ، فسوف يحتاجون إلى ملف مشترك مراقبة لمزامنة وانتظار وإخطار.
إنها "تعمل" عند تحديد مهلة لأنها تحول بشكل فعال استدعاء الانتظار إلى مكالمة نوم ... لا يزال لا يوجد شيء ينتظر/يخطر حقًا ، لأن الخيوط لا تزال تتعامل مع شاشات منفصلة.
نصائح أخرى
كائناتك لا تعمل في نفس الشاشة.
تحتاج إلى إما تحريك Wait () وإخطار () بنفس الكائن مثل:http://www.java-samples.com/showtutorial.php؟tutorialid=306
أو يمكنك إخطار الكائن الهدف:http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/tij315_016.htm
عند تعيين الانتظار (100). أنت تقوم بتعيين مهلة. وبالتأكيد سوف تستيقظ بعد 100 مللي ثانية.