Как сохранить пул имен? - PullRequest
4 голосов
/ 27 апреля 2010

Мне нужно вести список идентификаторов пользователей (учетных записей прокси), которые будут передаваться многопоточным клиентам. В основном клиенты будут использовать идентификаторы пользователей для выполнения действий; но для этого вопроса не важно, что это за действия. Когда клиент получает идентификатор пользователя, он становится недоступным для других клиентов до тех пор, пока действие не будет завершено.

Я пытаюсь представить параллельную структуру данных для поддержки этого пула идентификаторов пользователей. Есть идеи ? Будет ли ConcurrentQueue делать эту работу? Клиенты исключат ID пользователя из списка и добавят ID пользователя после завершения работы с ним.

Ответы [ 4 ]

2 голосов
/ 27 апреля 2010

Для аналогичной ситуации я реализовал свой собственный BlockingQueue . Пока вы отслеживаете пул идентификаторов, вы можете закрыть очередь в соответствующее время.

0 голосов
/ 27 апреля 2010

Подходит ли BlockingQueue? Какие действия следует предпринять, если очередь пуста? Похоже, у вас ограниченное количество подключений к программному обеспечению сторонних производителей. В этом случае вам может потребоваться показать пояснительное сообщение любому пользователю, который не может получить идентификатор пользователя. В этом случае блокировка не будет полезна. Вы можете просто реализовать некоторую синхронизацию вокруг стандартной очереди и обрабатывать пустые очереди по своему усмотрению. Как то так?

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);
    }
}

}

0 голосов
/ 27 апреля 2010

Я бы использовал BlockinQueue .

Это позволит клиентским потокам опрашивать идентификаторы (до тех пор, пока не станет доступен один из них или не будет превышено ограничение по времени) и отодвинуть их обратно после использования.

0 голосов
/ 27 апреля 2010

Вам действительно нужно иметь ограниченный пул пользователей? В противном случае каждый пользователь может просто иметь увеличивающийся ИД пользователя. Таким образом, нет риска столкновения, и мне кажется, что это намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...