我需要维护一个userid(代理帐户)列表,这些列表将被抛弃到多线程客户端。基本上客户端将使用用户标识来执行操作;但是对于这个问题,这些行动是什么并不重要。当客户端获取用户标识时,在操作完成之前,其他客户端无法使用它。
我正在考虑使用并发数据结构来维护这个用户标识池。 有任何想法吗 ? ConcurrentQueue会做这个工作吗?客户端将使用户标识出列,并在完成后再添加用户标识。
答案 0 :(得分:2)
对于类似情况,我实施了自己的BlockingQueue。只要您跟踪id池,就可以在适当的时候关闭队列。
答案 1 :(得分:0)
您真的需要有限的用户群吗?否则,每个用户只能有一个递增的用户ID。这样,就没有碰撞的风险,对我来说似乎更容易。
答案 2 :(得分:0)
我会使用BlockinQueue。
这将使客户端线程能够轮询id(直到超出一个可用或时间限制)并在使用后将其推回。
答案 3 :(得分:0)
BlockingQueue合适吗?如果队列为空,应该采取什么行动?听起来您可能与第三方软件的连接数量有限。在这种情况下,您可能希望向无法获取用户ID的任何用户显示解释性消息。在这种情况下,阻塞将没有用。您可以围绕标准队列实现一些同步,并根据需要处理空队列。像这样的东西?
public class UserIDQueue {
private static final Queue<String> USER_IDS = loadUserIDs();
private static final Object USER_ID_LOCK = new Object();
//doesn't need to be synchronized as it is called at class load time
private static Queue<String> loadUserIDs() {
Queue<String> userIDs = new LinkedList<String>();
for(String userID : THIRD_PARTY_USER_IDS) {
userIDs.add(userID);
}
return userIDs;
}
public static String getNextUserID() {
synchronized(USER_ID_LOCK) {
String userID = USER_IDS.poll();
if (userID == null) {
//not sure what your logic is, probably an exception
}
return userID;
}
}
public static void returnUserID(String userID) {
synchronized(USER_ID_LOCK) {
USER_IDS.add(userID);
}
}
}