من الإنهاء غير الآمن للخيوط إلى الإلغاء التعاوني
استبدل Thread.stop() والأعلام المشتركة المؤقتة بإلغاء مهام واعٍ بالمقاطعة.
مقارنة الكود
✕ Forced thread termination
Thread worker = new Thread(this::runTask); worker.start(); // May stop the thread while shared state is inconsistent. worker.stop();
✓ Future cancellation
Future<?> worker = executor.submit(this::runTask); // Requests interruption; the task must cooperate. worker.cancel(true);
هل ترى مشكلة في هذا الكود؟ أخبرنا.
لماذا يتفوق الأسلوب الحديث
يحافظ على الثوابت
تتوقف المهام فقط عند مسارات الكود المصممة للإلغاء.
تحكم موحّد
يمثّل Future التنفيذ والاكتمال والإلغاء معاً.
قابل للتركيب
تعمل المقاطعة مع قوائم الانتظار المحظورة والأقفال والمنفذات والخيوط الافتراضية.
الأسلوب القديم
Thread.stop()
الأسلوب الحديث
Future.cancel(true)
منذ JDK
5
الصعوبة
متقدم
دعم JDK
من الإنهاء غير الآمن للخيوط إلى الإلغاء التعاوني
متاح
تتوفر Future وExecutorService منذ JDK 5 (سبتمبر 2004).
كيف يعمل
يمكن لـ Thread.stop() إنهاء الكود بينما يمتلك مراقبات (monitors) أو أثناء تحديث حالة مشتركة، مما يترك الكائنات تالفة. الإلغاء الحديث تعاوني: ألغِ الـ Future بالمقاطعة، وانشر InterruptedException حيثما أمكن، واستعد حالة المقاطعة عندما لا يمكن نشرها، وصمّم المهمة للوصول إلى نقاط إلغاء آمنة.
توثيق ذو صلة
إثبات