如何使用共享资源与其他线程进行通信?

时间:2012-06-02 20:36:47

标签: java multithreading oop

有一个拍卖服务器接受客户端并为每个套接字连接一个新线程来服务客户端。每个线程都有它的协议。服务器只有一个Auction对象实例。 Auction对象包含Lot个对象的列表。 Auction对象作为参数传递给客户端线程。 Protocol必须有一种方式来出价并以某种方式通知所有客户端线程。 makeBid方法中存在Lot方法,并将出价列入出价列表。下一步是通知所有客户端线程表makeBid方法。这样做的最佳做法是什么? enter image description here

我尝试在Thread中使用字段(MSG)来保存消息。线程检查!MSG.isEmpty()run()是否!MSG.isEmpty()。如果ClientThread,那么MSG会打印到public class ClientServiceThread extends Thread { public String PRINT_NEW_MSG = ""; while (m_bRunThread) { if(!PRINT_NEW_MSG.isEmpty()){ out.println("PRINT_NEW_MSG: "+PRINT_NEW_MSG); PRINT_NEW_MSG = ""; String clientCommand = in.readLine(); ... } } 的套接字。我认为有更好的解决方案。


{{1}}

2 个答案:

答案 0 :(得分:1)

最好使用此对象同步“makeBid”方法。然后调用notifyAll方法

在makeBid的末尾。

答案 1 :(得分:1)

您可以创建一个订阅设计,只要客户在Lot上出价,就会调用lotUpdated()方法。每个ClientThread都会订阅它希望收到通知的Lots

public class Lot {
  private List<ClientThread> clients = new ArrayList<ClientThread>();
  private List<Integer> bids = new ArrayList<Integer>();

  public synchronized void subscribe(ClientThread t){
    clients.add(t);
  }

  public synchronized void unsubscribe(ClientThread t){
    clients.remove(t);
  }

  public synchronized void makeBid(int i){
    bids.add(i);
    for (ClientThread client : clients){
      client.lotUpdated(this);
    }
  }
}

public ClientThread {
  public void lotUpdated(Lot lot){
    //called when someone places a bid on a Lot that this client subscribed to
    out.println("Lot updated");
  }
}