2012-09-14 3 views
0

내 프로그램의 경우 실행중인 여러 개체에 대한 참조를 보유하기 위해 ConcurrentHashMap을 사용하고있었습니다.스레드 풀에서 실행중인 개체 액세스

public class Server { 

private ConcurrentHashMap<String, ChatRoom> _chatRooms; 
private ExecutorService _chatRoomExecutor; 
... 

// create a new channel executor to handle 50 chatrooms 
_chatRoomExecutor= Executors.newFixedThreadPool(50); 
// create an admin chatroom for testing at this point 
_chatRooms.put("/admin", new Channel("/admin")); 
// execute that chatroom 
_chatRoomExecutor.execute(_chatRooms.get("/admin")); 

내가 같은이 작품은 여전히 ​​ConcurrentHashMap의에서 채팅방에 액세스 할 수 있습니다 것 또는 내가 스레드 뭔가를해야 할 것 : 내 서버에서 은 내가 있나요?

+0

이것은 작동 할 수 있습니다. 필드가 변경되지 않도록 '최종'필드를 만듭니다. –

+1

"이것이 효과가 있을까요?"라는 말이 무슨 뜻인지 알기가 어렵습니다. –

+0

이 줄을 실행할 때 ConcurrentHashMap 이 보유 할 스레드에 대한 참조가 변경되는지는 알 수 없습니다. _chatRoomExecutor.execute (_chatRooms.get ("/ admin")); –

답변

1

ConcurrentHashMap에서 chatroom에 계속 액세스 할 수 있습니까? 아니면 threadpool에서 뭔가해야합니까?

예 코드가 정상적으로 작동합니다. 그러나 ChatRoom 개체의 필드에서 제대로 동기화하고 있는지 확인해야합니다.이 개체는 run() 메서드의 모두에서 스레드 풀 스레드는 물론 외부 스레드로부터 액세스합니다. ConcurrentHashMap에서 개체를 가져 오는 중입니다. 그것은 당신의 도전이 될 것입니다.

+0

이렇게하는 것이 가장 좋은 방법은 아니지만 모든 chatroom 객체 스레드는 방에 누군가가 있는지 확인합니다. 그렇지 않으면 스레드를 죽입니다. 다른 모든 대화방 작업 (예 : 채팅 전송, 클라이언트 가입/종료)은 대화방에 포함 된 집행자 서비스로 처리됩니다. 다른 모든 스레드는이 집행자 서비스에 자신의 작업을 제출합니다 –

+0

나는 훌륭한 아키텍처 @ ReCoNciLiaTiOn처럼 들립니다. – Gray

관련 문제