כיצד להרוג חוט ג'אווה

1. הקדמה

במאמר קצר זה, נכסה על עצירת א פְּתִיל בג'אווה - וזה לא כל כך פשוט מאז Thread.stop () השיטה הוצאה משימוש.

כפי שהוסבר בעדכון זה מאורקל, תפסיק() יכול להוביל לפגום באובייקטים מפוקחים.

2. שימוש בדגל

נתחיל בשיעור שיוצר ומתחיל שרשור. משימה זו לא תסתיים לבדה, ולכן אנו זקוקים לאיזו דרך לעצור את החוט הזה.

נשתמש בדגל אטומי לשם כך:

מחלקה ציבורית ControlSubThread מיישמת Runnable {private thread thread; גמר פרטי AtomicBoolean פועל = AtomicBoolean חדש (שקר); מרווח אינטראקטיבי פרטי; ציבורי ControlSubThread (int sleepInterval) {interval = sleepInterval; } התחלה בטלנית ציבורית () {עובד = שרשור חדש (זה); worker.start (); } עצירת חלל ציבורית () {running.set (false); } הפעלה בטלנית ציבורית () {running.set (true); while (running.get ()) {נסה {Thread.sleep (interval); } לתפוס (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("החוט הופרע, נכשל השלמת הפעולה"); } // עשה משהו כאן}}}

במקום שיהיה בזמן לולאת הערכת קבוע נָכוֹן, אנו משתמשים ב- אטומי בוליאני ועכשיו אנו יכולים להתחיל / להפסיק את הביצוע על ידי הגדרתו ל אמת שקר.

כפי שהוסבר במבוא שלנו למשתנים אטומיים, באמצעות אטומי בוליאני מונע התנגשויות בקביעת ובדיקת המשתנה משרשורים שונים.

3. הפרעה א פְּתִיל

מה קורה כאשר לִישׁוֹן() מוגדר למרווח ארוך, או אם אנו מחכים ל- לנעול שאולי לעולם לא ישוחרר?

אנו עומדים בסיכון לחסימה לתקופה ארוכה או לעולם לא להסתיים בצורה נקייה.

אנחנו יכולים ליצור את פסיקת() עבור מצבים אלה, בואו נוסיף לכיתה מספר שיטות ודגל חדש:

מחלקה ציבורית ControlSubThread מיישמת Runnable {private thread thread; ריצה פרטית של AtomicBoolean = AtomicBoolean חדשה (שקר); מרווח אינטראקטיבי פרטי; // ... הפרעה בטלנית ציבורית () {running.set (false); עובד. interrupt (); } בוליאני isRunning () {return running.get (); } בוליאני isStopped () {return stop.get (); } הפעלה בטלנית ציבורית () {running.set (true); stop.set (שקר); תוך כדי (running.get ()) {נסה {Thread.sleep (interval); } לתפוס (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("החוט הופרע, נכשל השלמת הפעולה"); } // לעשות משהו} stop.set (נכון); }} 

הוספנו פסיקת() שיטה שקובעת את שלנו רץ סמן כלא נכון וקורא לעובדי פתילים פסיקת() שיטה.

אם החוט ישן כאשר קוראים לזה, לִישׁוֹן() ייצא עם חריג מופרע, כמו כל שיחת חסימה אחרת.

זה מחזיר את השרשור לולאה, והוא ייצא מאז רץ הוא שקר.

4. מסקנה

במדריך מהיר זה בדקנו כיצד להשתמש במשתנה אטומי, בשילוב אופציונלי עם קריאה ל- פסיקת(), לכבות נקיון חוט. זה בהחלט עדיף על פני קוראים לנפגעים תפסיק() שיטה וסיכון נעילה לנצח ושחיתות זיכרון.

כמו תמיד, קוד המקור המלא זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found