سؤال

أنا ساذج إلى حد ما عندما يتعلق الأمر بعالم خيوط Java والتوافق. أحاول حاليا التعلم. لقد قدمت مثالاً بسيطاً لمحاولة معرفة كيفية عمل التزامن.

ها هو رمزتي:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadedService {

    private ExecutorService exec;

    /**
     * @param delegate
     * @param poolSize
     */
    public ThreadedService(int poolSize) {
        if (poolSize < 1) {
            this.exec = Executors.newCachedThreadPool();
        } else {
            this.exec = Executors.newFixedThreadPool(poolSize);
        }
    }

    public void add(final String str) {
        exec.execute(new Runnable() {
            public void run() {
                System.out.println(str);
            }

        });

    }

    public static void main(String args[]) {
        ThreadedService t = new ThreadedService(25);
        for (int i = 0; i < 100; i++) {
            t.add("ADD: " + i);
        }
    }

}

ما الذي يجب علي فعله لجعل الكود يطبع الأرقام 0-99 بترتيب متسلسل؟

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

المحلول

برك الموضوعات عادة ما تستخدم للعمليات التي لا تحتاج التزامن أو عالية موازى.

إن طباعة الأرقام 0-99 غير متتابعة ليست مشكلة متزامنة وتتطلب مزامنة مؤشرات الترابط لتجنب الطباعة خارج الترتيب.

أوصي بإلقاء نظرة على جافا درس التزامن للحصول على فكرة عن التزامن في جافا.

نصائح أخرى

فكرة المواضيع هي عدم القيام بالأشياء بالتتابع.

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

إن أبسط حل لمشكلتك هو استخدام حجم ThreadPool 1. ومع ذلك ، هذا ليس هو نوع المشكلة التي يمكن للمرء استخدامها لحل المواضيع.

للتوسع ، إذا قمت بإنشاء المنفذ الخاص بك مع:

this.exec = Executors.newSingleThreadExecutor();

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

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

المشكلة هي بحكم تعريفها غير مناسبة للمواضيع. يتم تشغيل المواضيع بشكل مستقل وليس هناك طريقة للتنبؤ بالخيط الذي يتم تشغيله أولاً.

إذا كنت ترغب في تغيير الكود الخاص بك لتشغيله بالتتابع ، فقم بإضافة إضافة إلى:

public void add(final String str) {
    System.out.println(str);
}

أنت لا تستخدم مؤشرات الترابط (وليس بنفسك على الأقل) ويحدث كل شيء بالتتابع.

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