2010-08-06 30 views
9

Tôi có một thread:làm thế nào để tiêu diệt một chuỗi đang đợi chức năng chặn cuộc gọi trong Java?

Thread t = new Thread(){ 
    public void run(){ 
     ServerSocketConnection scn = (ServerSocketConnection) 
       Connector.open("socket://:1234"); 
     // Wait for a connection. 
     SocketConnection sc = (SocketConnection) scn.acceptAndOpen(); 
     //do other operation 
    } 
}; 
t.start(); 

Hãy nói không khách hàng được kết nối với máy chủ, vì vậy chủ đề này sẽ blocked.Now Tôi muốn để diệt các sợi t trên? Làm thế nào tôi có thể giết nó?

Trả lời

7

Thread.interrupt() sẽ không làm gián đoạn luồng bị chặn trên ổ cắm. Bạn có thể thử gọi Thread.stop() hoặc Thread.destroy(), nhưng các phương pháp này không được chấp nhận (chỉnh sửa: thực tế, vắng mặt trong J2ME) và trong một số trường hợp không hoạt động, vì lý do bạn có thể đọc về here. Như bài viết đó đề cập đến, giải pháp tốt nhất trong trường hợp của bạn là đóng ổ cắm mà bạn đang chặn:

Trong một số trường hợp, bạn có thể sử dụng các thủ thuật cụ thể của ứng dụng. Ví dụ, nếu một thread đang chờ trên một socket đã biết, bạn có thể đóng socket để làm cho thread quay trở lại ngay lập tức. Thật không may, thực sự không có bất kỳ kỹ thuật nào hoạt động nói chung. Cần lưu ý rằng trong tất cả các tình huống mà một chuỗi chờ đợi không trả lời Thread.interrupt, nó cũng không trả lời Thread.stop. Các trường hợp như vậy bao gồm các cuộc tấn công từ chối dịch vụ có chủ ý và các hoạt động I/O mà thread.stop và thread.interrupt không hoạt động đúng cách.

+0

Bạn có chắc chắn không? Bạn đang tìm kiếm api nào? Tôi không thể tìm thấy Thread.stop() trong CLDC hoặc MIDP ... – aioobe

+0

@aioobe: J2SE ... trong mọi trường hợp tôi đang nói * không * sử dụng stop() –

+0

ok, vì anh ta đang nói về java- tôi ở đây ... – aioobe

0

Bạn có thể gọi thread.interrupt(). Điều này sẽ ném một số InterruptedException trong chủ đề của bạn

+0

bạn có chắc? acceptAndOpen không được khai báo để ném InterruptedException – aioobe

+0

đây là một ngoại lệ thời gian chạy không được tạo ra bởi acceptAndOpen mà bởi lớp Thread. –

+1

Trong đó API là InterruptedException ngoại lệ thời gian chạy? Bạn có một URL? – aioobe

0

Tạo chủ đề chính MONITOR THREAD (từ nơi bạn sinh ra chủ đề mới này) join() cho Chủ đề này. Nếu sau một thời gian nhất định, chuỗi này không "tham gia" thì bạn có thể bỏ qua (vô hiệu hóa) chuỗi này. Điều này sẽ cung cấp cho bạn một chức năng bổ sung thêm thời gian chờ để chặn luồng.

0

Trong chuỗi chính của bạn (khi bạn muốn chấm dứt chuỗi chấp nhận), hãy gọi scn.close(). Sau đó, acceptAndOpen sẽ ném một số IOException mà bạn có thể nắm bắt và sau đó chấm dứt chuỗi chấp nhận một cách duyên dáng.

ServerSocketConnection scn = 
    (ServerSocketConnection) Connector.open("socket://:1234"); 

Thread t = new Thread(){ 
    public void run(){ 
     // Wait for a connection. 
     try { 
      SocketConnection sc = (SocketConnection) scn.acceptAndOpen(); 
      //do other operation 
     } catch (IOException e) { 
      // Log the exception 
     } 
    } 
}; 

t.start(); 

// ... 

// Somewhere else... 
// Cancel the acceptAndOpen. 
scn.close(); 

Một ý tưởng tốt sẽ được giới thiệu một cơ chế đồng bộ hóa do đó bạn không đóng socket ngay sau khi acceptAndOpen đã trải qua.

0

Tôi nghĩ rằng bạn sẽ chỉ cần phải đóng kết nối - vì vậy chỉ cần thực hiện scn một lĩnh vực sợi chỉ và thực hiện:

public void stop() { 
    scn.close(); 
} 

và mã phương pháp chính của bạn để thoát khỏi một cách duyên dáng trên IOException hoặc dấu hiệu khác bạn đã hoàn thành (như bạn có thể đã có).

0

Tôi vừa mới đến trang này để tìm câu trả lời tương tự.Tôi tìm thấy một cách để đóng Chủ đề và đây là những gì tôi làm để kết thúc server:

private Thread serverThread; 

public void setUp(){ 
    //Run the server 
    serverThread = new Thread() { 
     public void run() { 
      try { 
       new Server(); //it calls acceptAndOpen() here 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 
    }; 
    serverThread.start(); 
} 

public void tearDown() { 
    serverThread = null; 
    System.gc(); 
} 

Về cơ bản, làm cho các bạn tham khảo đến máy chủ thread của bạn null, và sau đó cho phép các bộ thu rác làm sạch nguồn lực (đó là máy chủ của bạn) cho bạn.

Lưu ý mặc dù: này còn xa mới hoàn hảo, chúng ta nên không bao giờ phụ thuộc vào gc để làm công việc của mình, nhưng có vẻ như để làm việc mọi Tôi đã thử nó

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