idMap
동기화 문제가 있습니다. 이지도는 동시에 실행되는 두 개의 run()
메소드에서 사용되고 있습니다. 첫 번째 run() 메소드에서는 단순히 이벤트 id 값을 응답 ID (key)에 매핑합니다. 두 번째 run() 메소드에서 동일한 응답 ID (키)로 이벤트 ID (값)를 얻고 싶습니다. 그러나 때로는 일부 이벤트 ID가 있고 때때로 얻을 수 없습니다. 이 프로그램은 잘 컴파일하지만, 나는 스레딩 전문가가 아니며 스레딩이 동기화되지 않아 idMap
이 원인이라고 생각합니다. 제 질문은 단순히 idMap
을 원활하게 작동시키고 의도 한대로 이벤트 ID를 얻으려면 어떻게해야합니까?스레딩에서 Hashmap 동기화
ConcurrentHashMap<String, String> idMap = new ConcurrentHashMap<String, String>();
ConcurrentHashMap<String, ExecutorService> executors = new ConcurrentHashMap<String, ExecutorService>();
private final class ResponderTask implements Runnable {
private ResponderTask(Event event) {
this.event = event;
}
// 1st run()
public void run() {
idMap.put(response.getId(), event.getId());
}
}//end ResponderTask
private final class QuoteTask implements Runnable {
//constructor
//2nd run()
public void run() {
IdMap.get(response.getId());
}
}//end QuoteTask
public void onResponse(final Response response) {
ExecutorService quoteExecutor = executors.get(response.getId());
if (quoteExecutor == null) {
quoteExecutor = Executors.newSingleThreadExecutor();
executors.put(event.getId(), quoteExecutor);
}
quoteExecutor.execute(new ResponderTask(event));
}
: 당신이 종료하면 응용 프로그램을 수행 할 때 나는 다음과 같은 일을한다고 가정 java/util/concurrent/ConcurrentHashMap.html # get (java.lang.Object)) 정의를 사용하면 예상대로 키 값이 나타날 때까지 기다리지 않습니다. 이 작업을 수동으로 수행해야하는 것 같습니다. –
'response'와'event'는 같은 필드로되어 있습니까? – Gray