هل هناك طريقة بسيطة لمعرفة المهام التي يعمل عليها المنفذ Java في لحظة معينة؟

StackOverflow https://stackoverflow.com/questions/4609641

سؤال

أنا متأكد من أنه يمكنني اختراق شيء ما معًا من شأنه أن يمكّنني من اكتشاف ذلك ، لكنني آمل أن يكون هناك حل خارج الصندوق الذي أفتقده. قرأت المستندات لكنني لم أر أي شيء.

تطبيقي المحدد يستخدم ThreadPoolExecutor بدعم من أ DelayQueue, ، على الرغم من أنني لست متأكدًا من أن هذا مهم.

شكرًا!

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

المحلول

لا أعتقد أن هناك طريقة موثوقة للقيام بذلك. إذا كنت تريد التهم ، فهناك طرق متاحة (getTaskCount ()/getCompletedTaskCount ()) التي تساعد. إذا كنت بحاجة إلى المهام الفعلية ، فأنت بحاجة يدويًا لتتبع المهام ، من خلال التغلب على extexecute () و AfterExecute () هي طريقة واحدة.

نصائح أخرى

نهج واحد بسيط: قم بلف مهامك بالرمز الذي سيتصل بالإشارة إلى رد الاتصال بمهمة جديدة ، ويمرر جميع البيانات التي تريدها إلى:

interface StartTaskWatcher {
    void taskStarted(Object data);
}

class StartTaskSignalingWrapper implements Runnable {
    private final Runnable task;
    private final String taskDescription;
    private final StartTaskWatcher startTaskWatcher;

    StartTaskSignalingWrapper(Runnable task, String taskDescription, StartTaskWatcher startTaskWatcher) {
        this.task = task;
        this.taskDescription = taskDescription;
        this.startTaskWatcher = startTaskWatcher;
    }

    public void run() {
        startTaskWatcher.taskStarted(taskDescription);
        task.run();
    }
}

هل تحتاج فعليًا إلى معرفة وقت التشغيل ، أو لمجرد تصحيح الأخطاء؟

إذا كنت تقوم بتصحيح الأخطاء فقط ، ففكر في إلقاء نظرة على تطبيق JVISUALVM (تم تثبيته في دليل "Bin" لـ JDK). يتيح لك فحص جميع مؤشرات الترابط الجارية ديناميكيًا ، لذلك يجب أن يكون قادرًا على تزويدك ببعض الأفكار.

(يمكن لـ JVISUALVM أيضًا إجراء التنميط في وحدة المعالجة المركزية/الذاكرة ، مع النقاط الساخنة للتنفيذ والتخصيص ، ويظهر نشاط جمع القمامة في الوقت الفعلي.)

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