سؤال

أحاول التعرف على خيوط 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 مللي ثانية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top