2010-04-27 6 views
4

다중 스레드 클라이언트에 표시 될 사용자 ID (프록시 계정) 목록을 유지 관리해야합니다. 기본적으로 클라이언트는 사용자 ID를 사용하여 작업을 수행합니다. 그러나이 질문에 대해, 이러한 행동이 무엇인지는 중요하지 않습니다. 클라이언트가 사용자 ID를 확보하면 조치가 완료 될 때까지 다른 클라이언트가이를 사용할 수 없습니다.이름 풀을 유지하는 방법은 무엇입니까?

나는이 사용자 풀을 유지하기 위해 동시 데이터 구조를 생각하려고합니다. 아이디어가 있으십니까? ConcurrentQueue가 그 일을하겠습니까? 클라이언트는 사용자 ID를 대기 행렬에서 제거하고 사용자 ID가 끝나면 다시 추가합니다.

답변

2

비슷한 상황에서 나는 내 자신의 BlockingQueue을 구현했습니다. 당신이 적절한 시간에 대기열을 종료 할 수있는 ID 풀을 추적하는 한.

0

제한된 풀의 사용자 ID가 필요한가요? 그렇지 않으면, 각 사용자는 단순히 증가하는 사용자 ID를 가질 수 있습니다. 이렇게하면 충돌 위험이 없으며 훨씬 쉽게 느껴집니다.

+0

사용자 ID는 재사용 할 수 없습니다 필요하더라도, 대부분의 아마 아이디 충돌이 허용되지 않을 것입니다. – cherouvim

+0

사용할 수있는 사용자 ID 집합은 별도의 타사 시스템에서 관리합니다. 어쩔수없이. –

0

나는 BlockinQueue을 사용할 것입니다.

이렇게하면 클라이언트 스레드가 ID를 폴링 (사용할 수있는 한도 나 시간 제한을 초과 할 때까지) 한 다음 사용 후 다시 밀어 넣을 수 있습니다.

0

BlockingQueue가 적절한가요? 대기열이 비어있는 경우 취해야 할 조치는 무엇입니까? 제 3 자 소프트웨어에 대한 연결 수가 제한되어있는 것 같습니다. 이 경우 사용자 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); 
    } 
} 

}

관련 문제