سؤال

أنا أقوم بتنفيذ Parellel Quicksort كممارسة برمجة ، وبعد انتهائي ، قرأت صفحة Java التعليمية على المنفذين ، والتي تبدو وكأنها يمكن أن تجعل الكود الخاص بي أسرع. لسوء الحظ ، كنت أعتمد على Join () للتأكد من أن البرنامج لا يستمر حتى يتم فرز كل شيء. الآن أنا أستخدم:

public static void quicksort(double[] a, int left, int right) {
    if (right <= left) return;
    int i = partition(a, left, right);

    // threads is an AtomicInteger I'm using to make sure I don't
    // spawn a billion threads.
    if(threads.get() < 5){

        // ThreadSort's run method just calls quicksort()
        Future leftThread = e.submit(new ThreadSort(a, left, i-1));
        Future rightThread = e.submit(new ThreadSort(a, i+1, right));

        threads.getAndAdd(2);
        try {
            leftThread.get();
            rightThread.get();
        }
        catch (InterruptedException ex) {}
        catch (ExecutionException ex) {}
    }
    else{
        quicksort(a, left, i-1);
        quicksort(a, i+1, right);
    }
}

يبدو أن هذا يعمل بشكل جيد ، ولكن إذا قمت بتشغيل E.Shutdown () مباشرة بعد أن أتصل بأسلوب Quicksort () غير المتكرر ، فإنه يحتوي على مجموعة من DesideDexecutionExceptions ، لذلك أفترض أن هذا لا يعمل كما أردت.

على أي حال ، أحاول أساسًا الحصول على نفس الوظائف مثل LeftThread.so () ولكن مع المنفذ ، وأسئلتي هي:

هل هذه هي أفضل طريقة للانتظار حتى تتم جميع الخيوط؟

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

هل كانت مفيدة؟

المحلول

ما نوع المنفذ الذي تستخدمه؟

ThreadPoolExecutor.awaitTermination() ستفعل ما تسأل عنه (إنها عملية انضمام كبيرة بشكل فعال).

كإجمالي ، سيسمح لك ThreadPoolexecutor بتعيين حدود على # من المواضيع ، إلخ ... (قد يكون أفضل من الذهاب إلى العودية مثل ما تفعله إذا ارتفع عدد الخيوط ، غير متأكد).

ملاحظة - أشك في أن المنفذين سيجعلون الكود الخاص بك يعمل على تشغيل أي أسرع ، لكنهم قد يجعلون الكود أسهل في القراءة والصيانة. سيؤدي استخدام تجمع الخيوط إلى جعل الأمور أسرع لهذا النوع من الخوارزمية ، ويجعل المنفذ من السهل العمل مع تجمعات الخيوط.

نصائح أخرى

ألق نظرة على Executors.newFixedThreadPool مما يتيح لك إنشاء مجموعة من المواضيع في معظم n (تتخلص من "إذا") ExecutorService.shutdown الطريقة و ExecutorsService.awaitTermination طريقة.

يمكنك استخدام أ العد التنازلي

ملاحظة - أشك في أن المنفذين سيجعلون الكود الخاص بك يعمل على تشغيل أي أسرع ، لكنهم قد يجعلون الكود أسهل في القراءة والصيانة. سيؤدي استخدام تجمع الخيوط إلى جعل الأمور أسرع لهذا النوع من الخوارزمية ، ويجعل المنفذ من السهل العمل مع تجمعات الخيوط.

هذا غير صحيح.

يمكن "دعم" المنفذ بأي عدد من أنظمة التنفيذ المختلفة بما في ذلك الخيوط المجمعة.

تحتاج إلى استدعاء فئة المصنع بشكل صحيح.

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

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