2011-11-08 20 views
5

Tôi muốn làm gián đoạn một chủ đề, nhưng gọi ngắt() dường như không hoạt động, dưới đây là đoạn code mẫu:tại sao ngắt() không hoạt động như mong đợi và làm thế nào nó hoạt động

public class BasicThreadrRunner { 
    public static void main(String[] args) { 
     Thread t1 = new Thread(new Basic(), "thread1"); 
     t1.start(); 
     Thread t3 = new Thread(new Basic(), "thread3"); 
     Thread t4 = new Thread(new Basic(), "thread4"); 
     t3.start(); 
     t1.interrupt(); 
     t4.start(); 
    } 
} 
class Basic implements Runnable{ 
    public void run(){ 
     while(true) { 
      System.out.println(Thread.currentThread().getName()); 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       System.err.println("thread: " + Thread.currentThread().getName()); 
       //e.printStackTrace(); 
      } 
     } 
    } 
} 

nhưng sản lượng trông giống như thead1 vẫn đang chạy. Vì vậy, bất cứ ai có thể giải thích nó, làm thế nào gián đoạn() hoạt động, nhờ

Trả lời

12

Chủ đề vẫn chạy đơn giản chỉ vì bạn bắt InterruptedException và tiếp tục chạy. interrupt() chủ yếu đặt cờ trong đối tượng Thread, mà bạn có thể kiểm tra với isInterrupted(). Nó cũng gây ra một số phương pháp - sleep(), joinObject.wait(), cụ thể - để trả lại ngay lập tức bằng cách ném một số InterruptedException. Nó cũng gây ra một số hoạt động I/O để chấm dứt ngay lập tức. Nếu bạn nhìn thấy bản in từ khối catch, thì bạn có thể thấy rằng interrupt() đang hoạt động.

+0

: cảm ơn sự giúp đỡ của bạn – jason

10

Như những người khác đã nói, bạn bị gián đoạn nhưng không làm gì với nó. Những gì bạn cần làm là tuyên truyền ngắt sử dụng logic như,

while(!Thread.currentThread().isInterrupted()){ 
    try{ 
     // do stuff 
    }catch(InterruptedException e){ 
     Thread.currentThread().interrupt(); // propagate interrupt 
    } 
} 

Sử dụng vòng lặp logic, chẳng hạn như while(true) chỉ là lười biếng mã hóa. Thay vào đó, hãy thăm dò cờ bị gián đoạn của chuỗi để xác định việc chấm dứt thông qua gián đoạn.

+0

Hoặc bạn có thể di chuyển try/catch bên ngoài vòng lặp. ;) –

+2

Có, nhưng điều đó đã được đề cập bởi @MByD và nó giữ nguyên logic lặp không hợp lệ. : D – mre

+0

@mre: cảm ơn anwser của bạn – jason