2011-12-25 30 views
8

Tôi cố gắng để chấm dứt các chủ đề trong đoạn mã sau:ngắt() không hoạt động

public synchronized void run() { 
    try { 
     while (!Thread.currentThread().isInterrupted()) { 
      this.scan(); 
      this.distribute(); 
      this.wait(); 
     } 
    } catch (InterruptedException e) {} 
} 

public void cancel() { 
    this.interrupt(); 
} 

Nhưng thread sẽ không chấm dứt. Tôi đã sử dụng trình gỡ rối và phát hiện ra rằng sau lệnh this.interrupt(), luồng không bị gián đoạn (tôi đặt một chiếc đồng hồ trên biểu thức this.isInterrupted() và nó vẫn là false). Bất cứ ai cũng có một ý tưởng tại sao thread này sẽ không bị gián đoạn?

Chỉnh sửa:

Đã xảy ra sự cố. Hóa ra rằng có hai trường hợp của chủ đề này. Tôi gắn mã có vấn đề dẫn đến điều này:

/* (class Detector extends Thread) */ 
Detector detector = new Detector(board); 
... 
Thread tdetector = new Thread(detector); /* WRONG!!! */ 
... 
tdetector.start(); 
... 
+0

nếu bạn thử bằng '! Thread.interrupted()' trong điều kiện –

+0

Không có tĩnh trong lớp 'Thread' theo tên đó. Và nó sẽ không có ý nghĩa, bởi vì đây là một phương pháp có liên quan đến một thể hiện của lớp này. –

+0

Chắc chắn có một phương thức tĩnh ['Thread.interrupted()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#interrupted%28%29). Tôi không nghĩ rằng nó sẽ giúp, mặc dù, bởi vì về cơ bản nó làm điều tương tự như phương pháp cá thể (nhưng cũng xóa cờ bị gián đoạn, mà có thể làm phức tạp mọi thứ). –

Trả lời

5

Theo the docs, nếu bạn gọi interrupt() trong khi thread đang trong tình trạng wait(), ngắt lá cờ sẽ không được thiết lập. Bạn sẽ nhận được một ngoại lệ bị gián đoạn, mà sẽ thoát khỏi vòng lặp (và thread).

EDIT

mỗi nhận xét của tôi và trả lời của bạn, vấn đề là bạn có nhiều hơn một trong những chủ đề chạy.

+0

Nhưng luồng không chấm dứt. Toàn bộ chương trình không chấm dứt vì chủ đề này. –

+1

@LeifEricson - Chủ đề có bị kẹt trong một số chu trình tính toán bên trong 'scan()' hay 'distribution()' không? –

+0

No. Tôi đã sử dụng trình gỡ rối để xác nhận rằng nó không bao giờ bị kẹt bên trong các phương thức này. –

2

Có thể bạn đang gọi tới số cancel trên chuỗi không đúng. Nếu bạn nhìn vào nó, nó cancel() hủy chủ đề này. Bạn có thể muốn hủy một số chủ đề khác.

Nó cũng là sự thật rằng cuộc gọi của bạn để isInterrupted() là không cần thiết, nhưng điều đó sẽ không gây ra ngắt để bị mất ...


Mặt khác, nếu các phương pháp cancel là một phương pháp của một lớp mở rộng Thread, sau đó this có thể là chuỗi cần hủy. (Vấn đề đối với chúng tôi, những người đang cố gắng trả lời là có/không đủ chi tiết trong câu hỏi gốc ...)

+0

'cancel' dường như là một phương thức thể hiện, vì vậy' interrupt' đang được gọi trên đối tượng Thread chính xác. Phương thức này chắc chắn không phải được gọi trong khi thực hiện trên luồng đó (điều này sẽ làm cho kiểu phương thức vô dụng). Lệnh gọi 'isInterrupted()' là cần thiết nếu lệnh gọi 'interrupt()' xảy ra trong khi luồng thực sự là máy tính (trong trường hợp này không có ngắt InterruptedException). –

+1

No. Tôi muốn chấm dứt chuỗi này. Một luồng khác gọi phương thức 'cancel'. Đây là cách duy nhất tôi biết để chấm dứt một chuỗi có các phương thức chặn (như 'wait()') –

+0

Nhưng khi 'Chủ đề' khác hủy bỏ, nó sẽ tự hủy, không phải bạn. Bạn cần phải tìm cách lưu trữ ** chuỗi ** của bạn để hủy. Có lẽ trong phương thức 'run' của bạn, lưu trữ' Thread.getCurrentThread() 'của bạn và sau đó trong ngắt' hủy' ** của bạn mà luồng **. – OldCurmudgeon

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