توقف نخ در جاوا — راهنمای جامع

۱۴۸ بازدید
آخرین به‌روزرسانی: ۰۵ شهریور ۱۴۰۲
زمان مطالعه: ۲ دقیقه
توقف نخ در جاوا — راهنمای جامع

در این مقاله کوتاه با روش متوقف ساختن یک نخ جاوا یا همان Thread جاوا آشنا خواهیم شد. این کار از زمان منسوخ شدن متد ()Thread.stop دیگر به آن سادگی‌ها نیست. دلیل حذف این متد آن است که در پاره‌ای موارد منجر به از کار افتادن اشیای نظارت ‌شده می‌شد. با ما همراه باشید تا با روش توقف نخ در جاوا آشنا شوید.

استفاده از فلگ

کار خود را از کلاسی آغاز می‌کنیم که یک نخ را ایجاد و آغاز می‌کند. این وظیفه به صورت خودکار پایان نمی‌یابد و از این رو باید روشی برای متوقف کردن نخ پیدا کنیم.

به این منظور از یک فلگ اتمی استفاده می‌کنیم:

1public class ControlSubThread implements Runnable {
2 
3    private Thread worker;
4    private final AtomicBoolean running = new AtomicBoolean(false);
5    private int interval;
6 
7    public ControlSubThread(int sleepInterval) {
8        interval = sleepInterval;
9    }
10  
11    public void start() {
12        worker = new Thread(this);
13        worker.start();
14    }
15  
16    public void stop() {
17        running.set(false);
18    }
19 
20    public void run() { 
21        running.set(true);
22        while (running.get()) {
23            try { 
24                Thread.sleep(interval); 
25            } catch (InterruptedException e){ 
26                Thread.currentThread().interrupt();
27                System.out.println(
28                  "Thread was interrupted, Failed to complete operation");
29            }
30            // do something here 
31         } 
32    } 
33}

به جای این که یک حلقه While داشته باشیم که یک ثابت را به صورت true ارزیابی کند، از یک AtomicBoolean استفاده می‌کنیم و به این ترتیب می‌توانیم اجرا را با تعیین مقدار true یا false آغاز یا متوقف کنیم. استفاده از یک متغیر AtomicBoolean موجب می‌شود که از بروز تداخل در تنظیم و بررسی متغیر از روی نخ‌های مختلف جلوگیری کنیم.

متوقف ساختن نخ

زمانی که متد ()sleep روی یک بازه طولانی تعیین می‌شود یا زمانی که منتظر یک lock هستیم که شاید هرگز آزاد نشود، چه اتفاقی رخ می‌دهد؟ در این موارد با ریسک مسدودسازی برای مدتی طولانی یا کلاً عدم خاتمه تمیز مواجه می‌شویم. در این موقعیت‌ها می‌توانیم یک متد ()interrupt ایجاد کرده و چند متد و یک فلگ جدید به کلاس اضافه کنیم:

1public class ControlSubThread implements Runnable {
2 
3    private Thread worker;
4    private AtomicBoolean running = new AtomicBoolean(false);
5    private int interval;
6 
7    // ...
8 
9    public void interrupt() {
10        running.set(false);
11        worker.interrupt();
12    }
13 
14    boolean isRunning() {
15        return running.get();
16    }
17 
18    boolean isStopped() {
19        return stopped.get();
20    }
21 
22    public void run() {
23        running.set(true);
24        while (running.get()) {
25            try {
26                Thread.sleep(interval);
27            } catch (InterruptedException e){
28                Thread.currentThread().interrupt();
29                System.out.println(
30                  "Thread was interrupted, Failed to complete operation");
31            }
32            // do something
33        }
34    }
35}

بدین ترتیب متد ()interrupt را که فلگ running را روی مقدار false تنظیم می‌کند اضافه کرده و متد ()interrup نخ ورکر را فرا می‌خوانیم. اگر نخ در زمان این فراخوانی در حالت sleeping باشد، متد ()sleep با یک InterruptedException مانند هر فراخوانی مسدودسازی دیگر خارج می‌شود. بدین ترتیب نخ به حلقه بازمی‌گردد و زمانی که running روی flase تنظیم شود، خارج خواهد شد.

سخن پایانی

در این راهنمای کوتاه، به بررسی شیوه استفاده از متغیرهای اتمی پرداختیم، و آن‌ها را به صورت اختیاری با یک فراخوانی به ()interrupt ترکیب کردیم تا یک نخ را به روش تمیزی متوقف کنیم. این روش ترجیح بیشتری نسبت به فراخوانی متد منسوخ‌شده ()stop و پذیرش ریسک قفل شدن نخ رأی همیشه و از دست رفتن حافظه است.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *