Concurrency متوسط

استبدل 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
الصعوبة
متوسط
من مهام Timer إلى المنفذات المجدولة
متاح

متوفر على نطاق واسع منذ JDK 5 (سبتمبر 2004)

ينفذ Timer كل مهمة على خيط واحد، لذا فإن مهمة طويلة الأمد تؤخر المهام الأخرى، ويؤدي استثناء غير معالج إلى إنهاء خيط المؤقت. يستخدم ScheduledExecutorService إطار عمل المنفذات، ويدعم عدة عمال، ويعيد مقابض ScheduledFuture، ويوفر إدارة صريحة لدورة الحياة. يجب على المكوّن المالك إيقاف المجدول عند عدم الحاجة إليه.