0

拍卖服务器接受客户端并为每个套接字连接创建一个新线程来服务客户端。每个线程都有它的协议。服务器只有一个拍卖对象实例。Auctionobject 保存对象列表LotAuction对象作为参数传递给客户端线程。Protocol必须有办法出价并以某种方式通知所有客户端线程。该makeBid方法存在于Lot并将投标放入投标列表中。下一步是通知所有客户端线程表单makeBid方法。这样做的最佳做法是什么? 在此处输入图像描述

我尝试在 Thread 中使用字段 (MSG) 来保存消息。线程检查是否!MSG.isEmpty()run(). 如果!MSG.isEmpty()然后ClientThread打印到套接字 this 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();
                                 ...
            }
}
4

2 回答 2

1

更好的是,您可以使用此对象同步“makeBid”方法。然后调用 notifyAll 方法

在 makeBid 结束时。

于 2012-06-02T21:04:15.850 回答
1

lotUpdated()您可以创建一个订阅设计,该设计在客户对 Lot 出价时调用一个方法。每个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");
  }
}
于 2012-06-02T21:50:11.250 回答