2011-08-02 42 views
20

Tôi có một chuỗi, A có danh sách. Danh sách chứa một số đối tượng. Bây giờ tôi muốn thiết kế một mechanisim mà tôi có thể gửi một số tin nhắn đến chủ đề A.Giao tiếp giữa hai chủ đề

Thread A chạy trong vòng lặp (không chờ hoặc ngủ). Một số chủ đề khác, B, gửi một số tin nhắn đến chủ đề A và luồng A làm trống tất cả các hàng đợi của nó.

Làm cách nào để gửi thư giữa các chuỗi?

class A extends Thread { 
    List<Object> objs = something; //Init it 
    void run() { 
     while(true) { 
      //Body which works on objects. 
      //After receiving an external message, "A" should perform some action, for example, empty objects. 
     } 
    } 
} 

EDIT: Tôi có thể làm như thế này không?

class A extends Thread { 
    List<Object> objs = something; //Init it 
    Boolean flag = false; 

    public void setFlag(boolean value) { 
     synchronized(flag) { 
      this.flag = value; 
     } 
    } 

    public void getFlag() { 
     synchronized(flag) { 
      return this.flag; 
     } 
    } 

    void run() { 
     while(true) { 
      //Body which works on objects. 
      //After receiving an external message, A should perform some action, for example, empty objects. 
      if (getFlag == true) 
       //Empty list 
     } 
    } 
} 
+3

Trong Java, bạn thường không gửi thư giữa các chuỗi, nhưng bạn sử dụng đối tượng được đồng bộ hóa để chuyển giá trị giữa các chuỗi. – toto2

+0

Tôi đã đồng bộ hóa các biến mẫu như đã được tính toán trong bản chỉnh sửa mới của tôi, nó có hoạt động không? – akshay

+1

@akshay Bạn sửa đổi có vẻ OK (ngoại trừ bạn có nghĩa là 'if (getFlag() == true)'). Hàng đợi – toto2

Trả lời

32

Bạn có thể có BlockingQueue đối tượng tin nhắn. Các chủ đề khác sẽ đặt các thông điệp lên hàng đợi. Là một phần của vòng lặp while(true), luồng A sẽ poll xếp hàng và xử lý bất kỳ thư nào đã đến.

Trong mã:

class A extends Thread{ 
List<Object> objs = something ;//init it 
BlockingQueue<Message> queue = new LinkedBlockingQueue<Message>(); 
void run(){ 
    while(true){ 
     Message msg; 
     while ((msg = queue.poll()) != null) { 
     // process msg 
     } 
     // do other stuff 
    } 
    } 
} 

đề khác bây giờ có thể gọi queue.put() để gửi tin nhắn cho chủ đề A.

+0

là một biến mẫu của luồng A.Now nếu Chủ đề B sẽ thêm một số giá trị vào nó tại thời điểm mà luồng A đang truy xuất nó thì đó có phải là vấn đề không? – akshay

+1

@akshay: (1) 'hàng đợi' không phải là thành viên của' A' (tôi đã làm cho nó đơn giản như một minh họa); (2) 'BlockingQueue' là an toàn luồng, do đó, cả hai cách sẽ không có vấn đề gì. – NPE

+0

: Bản chỉnh sửa mới của tôi có giải quyết được vấn đề không ?????????? – akshay

0

Trong trường hợp đơn giản, bạn có thể thêm một số biến mẫu vào chuỗi A và có chuỗi B đặt giá trị của nó để cho biết luồng A phải xóa hàng đợi của nó. Trong trường hợp nâng cao hơn, bạn có thể sử dụng một số hàng đợi thông điệp mà cả hai luồng A và B đều có thể truy cập. B sẽ đặt một tin nhắn ở đó và A sẽ đọc và hành động trên đó.

Trong mọi trường hợp, quyền truy cập vào biến hoặc hàng đợi phải được bảo vệ đúng cách để truy cập nhiều chủ đề.

0

Bạn sẽ có thể thêm phương thức vào lớp "A" có thể được gọi ở nơi khác trong mã của bạn. Chỉ cần giữ tham chiếu đến ví dụ của bạn về lớp "A" ở một nơi dễ tiếp cận.

class A extends Thread{ 
List<Object> objs = something ;//init it 
void run(){ 
    while(true){ 
     //body which works on objs 
     //open receiving external message A should perform some action ie empty objs 
    } 
    } 
    void ChangeState() 
    { 
    //clear objs 
    } 
} 
+0

Sẽ gây ra vấn đề.Đối với vòng lặp của tôi sử dụng nhiều objs, nếu nó bị xóa suddently nó sẽ gây ra vấn đề – akshay

+0

Câu hỏi của bạn đã làm với làm thế nào để bạn gửi một tin nhắn đến chủ đề A để nó có thể thực hiện một hành động mong muốn. Câu trả lời của tôi đã được nhắm mục tiêu trực tiếp tại đó. Đã không đi vào thread an toàn như tôi giả sử bạn sẽ được thực hiện kiểm tra thích hợp (đồng bộ) trong mã của bạn trước khi thanh toán bù trừ hoặc đọc bất cứ điều gì. – Garvin

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