有一个拍卖服务器接受客户端并为每个套接字连接一个新线程来服务客户端。每个线程都有它的协议。服务器只有一个Auction对象实例。 Auction
对象包含Lot
个对象的列表。 Auction
对象作为参数传递给客户端线程。 Protocol
必须有一种方式来出价并以某种方式通知所有客户端线程。 makeBid
方法中存在Lot
方法,并将出价列入出价列表。下一步是通知所有客户端线程表makeBid
方法。这样做的最佳做法是什么?
我尝试在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}}
答案 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");
}
}