2017-12-07 16 views
0

지도를 통해 루핑 중이며 여러 개의 스레드가 있습니다. 지도의 대기열에 작업이 포함되어 있습니다. 내 목표는 모든 스레드에게 수행 할 작업을 제공하는 것입니다. 그러나 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 개 다른 스레드에 하나의 스레드 만

그래서 결국 어느 한 선량 가지고 동작을 게이트에 액세스하고 실행할 수있는 것이 수단 모든 항목 거 잠금 있음이 가진 문제점을 넣어 나를 도울 수있는 디자인 패턴? 감사합니다 ...

+0

[XY 문제] (https://meta.stackexchange.com/a/66378)처럼 들립니다. 지도를 스캔하는 스레드 만 있으면 [스레드 풀] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html)에 작업을 제출하면 어떨까요? ? –

+0

내가 설명에서 분명하지 않은 것 같은데 나는 두 가지 생각을하고 그들이 원하는 것을 나에게주지 않는다고 말했다. 나는 내 문제를 해결하기 위해 그렇게했다. 나는 어떤 사람이 내 코드를 수정하십시오. 다른 귀하의 솔루션 못해 내가 항목을 가지고 각 항목은이 대기열에 대기열이 포함되어 있습니다 스레드 작업이 항목 (대기열)을 발견하고 행동을 실행하는 것입니다 .. 그들에 대해 알고있는 몇 가지 제약을 가지고 위에서 읽을 수 있습니다 .. –

+0

결국 세마포어를 수정하는 솔루션을 찾았습니다 ... 세마포어와 "동기화 된"........의 조합은 어떤 식 으로든 고마워요 –

답변

1

지도에 java.util.concurrent 유형을 사용할 수 있습니다. 그들은 스레드 안전하므로 Syncronize가 필요하지 않습니다.

동기화 : 동기화 된 리소스는 여러 스레드에서 동시에 수정할 수 없습니다. 예를 들어, Collections.synchronizedMap (Map)에 의해 반환 된 MAP은 동기화 된 맵이되고 한 번에 하나의 스레드에 의해 수정 될 수 있지만 Concurrent Collections는 여러 스레드가 요구 사항에 따라 지정된 시간에 컬렉션의 다른 부분에 액세스 할 수있게합니다. 예를 들어 ConcurentHashMap에 대한 오버로드 된 생성자가 있는데, 이는 입력 concurrencyLevel을 콜렉션에 동시에 액세스 할 수있는 스레드의 수로 가져옵니다.

+0

옆에있는 동시 컬렉션을 사용할 수 없습니다. 2 스레드 그들 중 하나를 기다리고있어 컬렉션을 변경하려고하지만 ... 내 경우에는 2 스레드가 두 가지 항목을 변경하려고하면 기다려서는 안된다. –

+0

그게 정확히 동시성 Collectoins에 대한, 같은지도를 엉망으로 스레드 = P –

+0

두 스레드가 두 개의 다른 항목을 얻으려고하면 그 중 하나가 바로 기다려야합니까? –