من مهام Timer إلى المنفذات المجدولة
استبدل Timer و TimerTask بـ ScheduledExecutorService للحصول على عمل مجدول أكثر قوة.
مقارنة الكود
✕ Timer and TimerTask
Timer timer = new Timer("refresh-timer");
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
refresh();
}
}, 0, 60_000);
✓ ScheduledExecutorService
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(2);
scheduler.scheduleAtFixedRate(
this::refresh, 0, 1, TimeUnit.MINUTES);
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
عزل أفضل
يمنع تجمع الخيوط القابل للتهيئة الجداول غير المرتبطة من مشاركة عامل واحد هش.
تنفيذ قوي
فشل مهمة واحدة لا ينهي المجدول نفسه.
دورة حياة قابلة للتحكم
تستخدم الـ Futures والإلغاء والتأخيرات والإيقاف واجهات برمجة تطبيقات المنفذ القياسية.
الأسلوب القديم
Timer و TimerTask
الأسلوب الحديث
ScheduledExecutorService
منذ JDK
5
الصعوبة
متوسط
دعم JDK
من مهام Timer إلى المنفذات المجدولة
متاح
متوفر على نطاق واسع منذ JDK 5 (سبتمبر 2004)
كيف يعمل
ينفذ Timer كل مهمة على خيط واحد، لذا فإن مهمة طويلة الأمد تؤخر المهام الأخرى، ويؤدي استثناء غير معالج إلى إنهاء خيط المؤقت. يستخدم ScheduledExecutorService إطار عمل المنفذات، ويدعم عدة عمال، ويعيد مقابض ScheduledFuture، ويوفر إدارة صريحة لدورة الحياة. يجب على المكوّن المالك إيقاف المجدول عند عدم الحاجة إليه.
توثيق ذو صلة
إثبات