Cách hủy một chuỗi Java

1. Giới thiệu

Trong bài viết ngắn gọn này, chúng tôi sẽ đề cập đến việc dừng một Thread trong Java - điều này không hề đơn giản vì phương thức Thread.stop () không còn được dùng nữa.

Như đã giải thích trong bản cập nhật này từ Oracle, stop () có thể dẫn đến các đối tượng được giám sát bị hỏng.

2. Sử dụng cờ

Hãy bắt đầu với một lớp tạo và bắt đầu một luồng. Tác vụ này sẽ không tự kết thúc, vì vậy chúng tôi cần một số cách để dừng chuỗi đó.

Chúng tôi sẽ sử dụng cờ nguyên tử cho điều đó:

public class ControlSubThread implements Runnable { private Thread worker; private final AtomicBoolean running = new AtomicBoolean(false); private int interval; public ControlSubThread(int sleepInterval) { interval = sleepInterval; } public void start() { worker = new Thread(this); worker.start(); } public void stop() { running.set(false); } public void run() { running.set(true); while (running.get()) { try { Thread.sleep(interval); } catch (InterruptedException e){ Thread.currentThread().interrupt(); System.out.println( "Thread was interrupted, Failed to complete operation"); } // do something here } } }

Thay vì có một trong khi vòng lặp đánh giá một hằng đúng , chúng tôi đang sử dụng một AtomicBoolean và bây giờ chúng tôi có thể bắt đầu / dừng thực hiện bằng cách thiết lập nó để đúng / sai.

Như đã giải thích trong phần giới thiệu của chúng tôi về Biến nguyên tử, việc sử dụng AtomicBoolean ngăn ngừa xung đột trong việc thiết lập và kiểm tra biến từ các chuỗi khác nhau.

3. Ngắt một chủ đề

Điều gì xảy ra khi sleep () được đặt thành một khoảng thời gian dài hoặc nếu chúng ta đang chờ một khóa có thể không bao giờ được mở ra?

Chúng ta phải đối mặt với nguy cơ tắc nghẽn trong một thời gian dài hoặc không bao giờ chấm dứt sạch sẽ.

Chúng ta có thể tạo ngắt () cho những trường hợp này, hãy thêm một vài phương thức và một cờ mới vào lớp:

public class ControlSubThread implements Runnable { private Thread worker; private AtomicBoolean running = new AtomicBoolean(false); private int interval; // ... public void interrupt() { running.set(false); worker.interrupt(); } boolean isRunning() { return running.get(); } boolean isStopped() { return stopped.get(); } public void run() { running.set(true); stopped.set(false); while (running.get()) { try { Thread.sleep(interval); } catch (InterruptedException e){ Thread.currentThread().interrupt(); System.out.println( "Thread was interrupted, Failed to complete operation"); } // do something } stopped.set(true); } } 

Chúng tôi đã thêm một phương thức ngắt () đặt cờ đang chạy của chúng tôi thành false và gọi phương thức ngắt () của luồng công nhân .

Nếu luồng đang ngủ khi điều này được gọi, sleep () sẽ thoát với một ngoại lệ gián đoạn, giống như bất kỳ lệnh gọi chặn nào khác.

Điều này trả về luồng trở lại vòng lặp và nó sẽ thoát ra vì việc chạy là sai.

4. Kết luận

Trong hướng dẫn nhanh này, chúng ta đã xem xét cách sử dụng một biến nguyên tử, được kết hợp tùy chọn với lời gọi ngắt (), để đóng một chuỗi hoàn toàn. Điều này chắc chắn thích hợp hơn khi gọi phương thức stop () không dùng nữa và có nguy cơ bị khóa vĩnh viễn và hỏng bộ nhớ.

Như mọi khi, mã nguồn đầy đủ có sẵn trên GitHub.