2012-04-13 5 views
5

Tôi có khối mã sau đây:Thoát khỏi một sợi

public void startListening() throws Exception { 
    serverSocket = new DatagramSocket(port); 
    new Thread() { 

     @Override 
     public void run() { 
      System.out.print("Started Listening"); 
      byte[] receiveData = new byte[1024]; 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      while (!stopFlag) { 
       try { 
        serverSocket.receive(receivePacket); 
        String message = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + message); 
       } catch (Exception ex) { 
        System.out.print("Execption :" + ex.getMessage()); 
       } 
      } 
     } 
    }.start(); 
} 


public void stopListening() { 
    this.stopFlag = true; 
} 

Giả sử tôi đặt stopFlag là true. serverSocket.receive(receivePacket); sẽ đợi cho đến khi nó nhận được gói. Tôi nên làm gì nếu tôi muốn chuỗi thoát ngay khi stopFlag được đặt thành true.

Trả lời

6

Tôi cũng gặp vấn đề tương tự với ổ cắm và ngắt() không hoạt động. Vấn đề của tôi đã được giải quyết bằng cách đóng socket. Vì vậy, trong phương thức setStop() (như đã đề xuất ở trên), bạn sẽ phải gọi serverSocket.close() (rõ ràng là bạn phải làm cho serverSocket thành viên lớp hoặc thứ gì đó).

+0

Tôi hoàn toàn quên rằng một :). Tôi hy vọng bạn coi đó là lòng biết ơn rằng tôi sẽ chỉnh sửa câu trả lời của tôi cho độc giả trong tương lai. –

+0

@mistalee nó hoạt động ... cảm ơn –

2

Tôi không chắc chắn nơi cờ dừng xuất phát nhưng dù sao, câu trả lời bị gián đoạn.

Thread t; 
ServerSoket serverSoket; 

public void startListening() throws Exception { 
    ... 
    serverSocket = new DatagramSocket(port); 
    t = new Thread()...; 
    t.start(); 
    ... 
} 

setStop() { 
    stopFlag = true; 
    serverSocket.close() 
    t.interrupt(); 
} 
+0

.interrupt() không hoạt động. –

+1

@AkhilKNambiar Tôi đã thêm một phần của người mù dưới đây. Vui lòng thử lại (và cho anh ta/cô ấy một upvote) –

2

Sẽ có ích nếu bạn có một số mã bao gồm mã mà bạn định thay đổi stopFlag. Nếu nó nằm ngoài chủ đề, bạn có thể sử dụng .interrupt() trên luồng theo sau là .destroy() trên chuỗi. Nó không phải là một giải pháp lý tưởng tốt hơn có lẽ để thử và thêm một thời gian chờ trên ổ cắm máy chủ của bạn xem phương pháp setSoTimeout() của DatagramSocket trong api java.

+2

việc phá hủy là không cần thiết và không được khuyến nghị. –

+0

Cảm ơn cho đầu vào này làm nổi bật thực tế là một interupt không phải là lý tưởng như là tiêu diệt không dọn dẹp sau khi Thread tốt hơn để cho nó kết thúc tự nhiên bằng cách ngừng nhận được treo. – timash11

+1

gián đoạn là hoàn hảo cho tình huống này. Nó ném một ngoại lệ gián đoạn tại nơi mà các chủ đề hiện đang chờ đợi và có thể được làm sạch sau đó trong khối catch –

0

Sử dụng serverSocket.setSoTimeout(t).