지도를 통해 루핑 중이며 여러 개의 스레드가 있습니다. 지도의 대기열에 작업이 포함되어 있습니다. 내 목표는 모든 스레드에게 수행 할 작업을 제공하는 것입니다. 그러나 2 스레드 (또는 그 이상)는 하나의 큐에서 2 작업 (또는 그 이상)을 실행할 수 있습니다. 모든 스레드가 큐를 검색하고 큐를 잠그는 것을 의미합니다. 대기열에 작업이 있는지 확인하십시오. 예이면 작업을 실행하기 위해 다른 대기열을 검색하지 않으면 대기열 중 하나를 실행합니다. 참고 : 큐의 수는 다른 스레드가 수행하는 작업을 검색하면하는거야라는 것이다 나는 '의 Map.Entry'동기화 및 세마포어
public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
Synchronized(entry)
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null)
break;
}
}
}
}
문제에 동기화하려고 전자 스레드 수보다 클 수 있습니다 첫 번째 스레드가 작업을 완료하거나 기다리는 것을 끝내기 위해 동기화 된 라인 및 대기에 걸릴 수 있으며 원하는 것은 아닙니다. 내가 어떤 스레드가 다른 스레드가 그냥 건너 뛰고
그래서 난 주위 팠 검색을 계속 작업중인 큐에 도달하면 큐를 검색하는 모든 스레드를 원하는 세마포어 발견 그래서 나는이
Semaphore Gate = new Semaphore(1);
public void run() {
while (true) {
Action<?> act;
for (Map.Entry entry :ActionMap.entrySet()) {
if(Gate.tryAcquire());
{
act = ((Queue<Action>)entry.getValue()).poll();
if (act == null){
Gate.Release();
break;
}
else {
act.handle();
Gate.Release();
}
}
}
}
}
에 도달
는 Gate.aquire()는 2 개 diffirent 항목 2 개 다른 스레드에 하나의 스레드 만
가그래서 결국 어느 한 선량 가지고 동작을 게이트에 액세스하고 실행할 수있는 것이 수단 모든 항목 거 잠금 있음이 가진 문제점을 넣어 나를 도울 수있는 디자인 패턴? 감사합니다 ...
[XY 문제] (https://meta.stackexchange.com/a/66378)처럼 들립니다. 지도를 스캔하는 스레드 만 있으면 [스레드 풀] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html)에 작업을 제출하면 어떨까요? ? –
내가 설명에서 분명하지 않은 것 같은데 나는 두 가지 생각을하고 그들이 원하는 것을 나에게주지 않는다고 말했다. 나는 내 문제를 해결하기 위해 그렇게했다. 나는 어떤 사람이 내 코드를 수정하십시오. 다른 귀하의 솔루션 못해 내가 항목을 가지고 각 항목은이 대기열에 대기열이 포함되어 있습니다 스레드 작업이 항목 (대기열)을 발견하고 행동을 실행하는 것입니다 .. 그들에 대해 알고있는 몇 가지 제약을 가지고 위에서 읽을 수 있습니다 .. –
결국 세마포어를 수정하는 솔루션을 찾았습니다 ... 세마포어와 "동기화 된"........의 조합은 어떤 식 으로든 고마워요 –