هل هناك طريقة بسيطة لمعرفة المهام التي يعمل عليها المنفذ Java في لحظة معينة؟
-
25-09-2019 - |
سؤال
أنا متأكد من أنه يمكنني اختراق شيء ما معًا من شأنه أن يمكّنني من اكتشاف ذلك ، لكنني آمل أن يكون هناك حل خارج الصندوق الذي أفتقده. قرأت المستندات لكنني لم أر أي شيء.
تطبيقي المحدد يستخدم 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 أيضًا إجراء التنميط في وحدة المعالجة المركزية/الذاكرة ، مع النقاط الساخنة للتنفيذ والتخصيص ، ويظهر نشاط جمع القمامة في الوقت الفعلي.)