gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:45:56 24 4
gpt4 key购买 nike

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

我尝试使用线程中的字段(MSG)来保存消息。线程在 run() 中检查是否 !MSG.isEmpty()。如果 !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();
...
}
}

最佳答案

您可以创建一个订阅设计,每当客户对商品出价时,该设计都会调用 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");
}
}

关于java - 如何使用共享资源与其他线程通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10865756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com