2011-01-21 46 views
14

Khi chuỗi chỉ còn hoạt động, làm thế nào tôi có thể dừng chỉ định? Tôi đã đưa ra nhưLàm thế nào để ngăn chặn một sợi?

if(thread.isAlive()){ 
    thread.stop(); 
} 

nhưng phương pháp dừng được chấp nhận và được ném một ngoại lệ

01-21 14:12:40.188: ERROR/global(535):  Deprecated Thread methods are not supported. 
01-21 14:12:40.188: ERROR/global(535): java.lang.UnsupportedOperationException 
01-21 14:12:40.188: ERROR/global(535):  at java.lang.VMThread.stop(VMThread.java:85) 
01-21 14:12:40.188: ERROR/global(535):  at java.lang.Thread.stop(Thread.java:1379) 
01-21 14:12:40.188: ERROR/global(535):  at java.lang.Thread.stop(Thread.java:1344) 

Làm thế nào chúng ta có thể giải quyết này?

+3

"Không được hỗ trợ Phương thức chủ đề không được hỗ trợ". Thật tuyệt. :) – GolezTrol

Trả lời

37

Nói chung, bạn không buộc dừng đề tài vì nó nguy hiểm. Bạn đặt một lá cờ cho biết chuỗi đang được đề cập đến để thoát ra khỏi vòng lặp luồng của nó trong các trường hợp được kiểm soát.

loop chủ đề của bạn trông giống cùng những dòng này:

void run() { 
    while (shouldContinue) { 
    doThreadWorkUnit(); 
    } 
} 

Và ở một nơi khác bạn đặt biến shouldContinue và chờ cho thread để kết thúc:

... 
thread.shouldContinue = false; 
thread.join(); 
... 

(Tất cả điều này có thể không đúng Java, vì tôi không làm Java. Xem nó dưới dạng mã giả và sửa đổi cho thư viện/ngôn ngữ thực tế của bạn/v.v.)

+1

Tôi đồng ý với bạn, nhưng những gì về chủ đề không looping? Tôi có nghĩa là nhiều hơn như hoạt động IO nặng, nó là một thực hành tốt để gọi "gián đoạn()"? – mdelolmo

+0

@mdelolmo Tôi muốn nói không, bạn vẫn muốn đặt cờ hủy và về cơ bản bỏ qua nó. Nếu nó chặn, nó không sử dụng bất kỳ CPU nào. Nhưng tôi chắc chắn có những ý kiến ​​khác về điều này là tốt. Lưu ý các từ chồn của tôi "Nói chung" trong bài đăng - Tôi chắc chắn có những ngoại lệ. Ai đó nhất định phải đưa ra một môi trường nhúng hoặc somesuch, nơi bạn luôn làm gián đoạn các chủ đề của bạn. ;) –

+0

Nếu bạn đang sử dụng một HandlerThread, chỉ cần gọi quit() hoặc quitSafely() và nó thực hiện chính xác điều này thay cho bạn. Đối với các chuỗi có phần chặn dài, bạn có thể muốn chèn kiểm tra định kỳ để xem liệu chuỗi có cần thoát hay không. – Dorje

0

Trong một tổ chức phi chủ đề looping implmentation, bạn luôn có thể sử dụng một số điều như thế này ngay từ đầu rất mã chủ đề như:

void run() { 
    if (!shouldContinue) { 
     return 1; 
    } 
    .. 
    then rest of the thread code 
    .. 
} 
2

Better bạn phải sử dụng phương pháp này của thread, để ngăn chặn nó.

Thread.interrupt(); 

Vì vậy, bạn cũng có thể lưu trạng thái chuỗi.

Các vấn đề liên quan