2013-05-06 33 views
7

Tôi đã có một chuỗi chính và trong chuỗi đó tôi bắt đầu một chuỗi mới. (chủ đề con). Chuỗi con đó mở một ổ cắm máy chủ và bắt đầu nghe kết nối. Tôi muốn chủ đề đó ngừng thực thi và đóng bất kỳ chủ đề nào đã được khởi tạo (như Socket) khi luồng chính nhận được tin nhắn từ bên ngoài (từ nơi nó nhận được tin nhắn không phải là mối quan tâm). Làm thế nào tôi nên dừng thread và đóng tất cả các kết nối là những gì tôi muốn.Giao tiếp giữa chuỗi gốc và con trong Java

Tôi có nên sử dụng biến được chia sẻ không? để khi luồng chính nhận được thông báo, nó sẽ sửa đổi nó và chuỗi con sẽ liên tục kiểm tra các thay đổi trong biến chia sẻ đó?

Tôi nên triển khai nó như thế nào? Một số liên kết hữu ích có thể giúp hoặc mã mẫu?

Những gì tôi đã cố gắng thực hiện như sau: trong thread chính tôi đã tuyên bố một biến

flag=0; 

khi thread chính nhận được tin nhắn, nó đặt

flag = 1 ; 

và thread nghe cho thay đổi như sau:

void()run{ 

     while(true){ 

      if(flag==1){ 
        break; 
       } 

     sock1 = Ssocket.accept(); 
    } 

Nhưng mã trên không có t ở tất cả các công việc. Tôi nên làm như thế nào?

+0

tôi sẽ cố gắng và liên hệ lại với bạn ... nhưng có gì sai trong mã của tôi? – neerajDorle

+0

cờ chỉ được thay đổi cho chuỗi gốc của bạn, chuỗi con vẫn nhìn thấy nó là "0" –

+3

Làm cho cờ dễ bay hơi. 'cờ int dễ bay hơi;'. – maba

Trả lời

3

Child thread

Bạn nên thực hiện một chức năng mới đây, fe:

public void setFlag(int i) 
    { 
    flag = i; 
    } 

Parent Thread

Bất cứ khi nào bạn muốn giết/dừng nghe/... ở trẻ em chủ đề, gọi điện tới:

childThread.setFlag(1); 

Nếu bạn không cần các con Chủ đề được ẩn danh, tạo một ChildThread lớp:

public ChildThread implements Runnable 
{ 
    private int flag = 0; 

    public ChildThread() 
    { } 

    public void setFlag(int i) 
     { 
     flag = i; 
     } 
    public void run() 
     { 
     //your code 
     } 
    .... 
} 
+0

Tôi không thể gọi childThread .setFlag (1) từ chủ đề chính ..... Nó hiển thị một số lỗi. – neerajDorle

+0

thay đổi "childThread" cho tên của chủ đề con thực tế của bạn;) –

+0

Tôi hoàn toàn mới đối với đa luồng – neerajDorle

-1

Mở rộng Runnable với thực hiện của riêng bạn:

public class StoppableRunnable extends Runnable { 

} 

Mã lớp học của bạn để bạn có thể ngừng thực hiện Runnable, bạn sẽ tìm thấy một ví dụ tốt về cách thực hiện việc này tại đây How to properly stop the Thread in Java?. Hãy chắc chắn rằng bạn nhìn vào hai câu trả lời đầu tiên.

Trong tương đương của bạn trong những terminate() chức năng, làm tất cả dọn dẹp của bạn

0

Nếu bạn đang sử dụng một lá cờ để báo hiệu một thread để dừng lại, đảm bảo truy cập đọc/ghi được đồng bộ. Ví dụ:


    public synchronized void cancel() 
    { 
     stop = true; 
    } 

    protected synchronized boolean cancelRequested() 
    { 
     return stop; 
    } 
+0

chờ đợi, bạn có phải là thần thoại tony pony ??? –

+0

Không ... Tôi là [unicorn] (http://meta.stackexchange.com/a/19479/159861) –

+0

http://stackoverflow.com/questions/16413498/blue-tooth-file-not- gửi-lỗi, bạn có thể xin vui lòng đi qua câu hỏi này và xem nếu bạn có thể giải quyết vấn đề? trên android-bluetooth – neerajDorle

6

Cách thích hợp để ngắt chuỗi là thông qua cơ chế gián đoạn.Trong chủ đề chính của bạn, khi bạn muốn dừng thread con, bạn gọi:

childTread.interrupt(); 

và trong sợi con, bạn làm như sau:

public void run() { 
    try { 
     while (!Thread.currentThread.isInterrupted) { 
      sock1 = Ssocket.accept(); 
      //rest of the code here 
     } 
    } catch (InterruptedException e) { 
     Thread.currentThread.interrupt(); //good practice 
    } 
    //cleanup code here: close sockets etc. 
} 

Lưu ý rằng Ssocket.accept không ngắt được, vì vậy nếu bạn muốn dừng nó chờ đợi, bạn sẽ phải đóng nó từ bên ngoài, để buộc nó phải ném một IOException.

+0

Tôi nên đóng nó từ bên ngoài như thế nào? chỉ có chủ đề con của tôi có kiến ​​thức về Socket ..... hoặc tôi nên khai báo nó ở đâu đó bên ngoài chủ đề con? trong chủ đề chính? – neerajDorle

+0

Bạn có thể cung cấp phương thức 'closeSocket' trong chuỗi con của bạn để đóng socket (và làm cho' accept' ném một ngoại lệ).Bạn sẽ cần phải gọi nó từ một chủ đề khác nhau của khóa học. – assylias

+0

thankyou .... Tôi sẽ cố gắng gợi ý của bạn !! – neerajDorle

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