2016-06-30 4 views
0

ReentrantLock을 SpringXD에서의 작업에 추가하려고 시도하지만 가끔씩 스레드 간 중단이있는 것으로 보입니다. 예를 들어ReentrantLock이 SpringXD에서 작동하지 않는 이유

, 나는이 코드를 가지고 :

public class LoadGenerator extends MessageProducerSupport { 

private final AtomicBoolean running = new AtomicBoolean(false); 
private ExecutorService executorService; 

Logger logger = LoggerFactory.getLogger(LoadGenerator.class); 

public LoadGenerator(){} 

@Override 
protected void doStart() { 
    executorService = Executors.newFixedThreadPool(2); 
    if (running.compareAndSet(false, true)) { 
     for (int x = 0; x < 10; x++) { 
      executorService.submit(new Producer(Integer.toString(x))); 
     } 
    } 
} 

@Override 
protected void doStop() { 
    if (running.compareAndSet(true, false)) { 
     executorService.shutdown(); 
    } 
} 

protected class Producer implements Runnable { 
    String prefix; 
    Lock lock = new ReentrantLock(); 

    public Producer(String prefix) { 
     this.prefix = prefix; 
    } 

    private void send() { 
     lock.lock(); 
     try{ 
      for(int i = 0; i < 10; i++){ 
       System.out.println(Thread.currentThread().getName() + " " + i); 
      } 
     }finally{ 
      lock.unlock(); 
     } 
    } 

    public void run() { 
     send(); 
    } 
} 
} 

내가 무엇을, 그것에서 기대하는 모든 스레드의 순서와 순서가 중단되어서는 안

pool-604-thread-1 0 
pool-604-thread-1 1 
pool-604-thread-1 2 
pool-604-thread-1 3 
pool-604-thread-1 4 
pool-604-thread-1 5 
pool-604-thread-1 6 
pool-604-thread-1 7 
pool-604-thread-1 8 
pool-604-thread-1 9 
pool-604-thread-2 0 
pool-604-thread-2 1 
pool-604-thread-2 2 
pool-604-thread-2 3 
pool-604-thread-2 4 
pool-604-thread-2 5 
pool-604-thread-2 6 
pool-604-thread-2 7 
pool-604-thread-2 8 
pool-604-thread-2 9 
... 

같은 목록입니다,하지만, 사실 때때로 다음과 같은 방해가 있습니다 :

pool-604-thread-1 0 
pool-604-thread-2 0 
pool-604-thread-2 1 
pool-604-thread-2 2 
pool-604-thread-1 1 
pool-604-thread-1 2 
pool-604-thread-1 3 

무엇이 잘못 되었습니까? 잠금은 이클립스의 localhost에서 잘 작동한다.

SpringXD는 분산 시스템인가요? 하지만 xdadmin에 하나의 xdcontaier 만 연결되어 있습니다.

감사합니다.

답변

3

당신은 생산자 같은 일 ReentrantLock를 공유해야합니다, 당신의 ReentrantLock 모든 새로운 Runnable에서 그것을 만들 수 없습니다 통과해야합니다

@Override 
protected void doStart() { 
    executorService = Executors.newFixedThreadPool(2); 
    Lock lock = new ReentrantLock(); // create a share lock to lock in multi threads 
    if (running.compareAndSet(false, true)) { 
     for (int x = 0; x < 10; x++) { 
      executorService.submit(new Producer(Integer.toString(x), lock)); //pass this lock to every producer 
     } 
    } 
} 
protected class Producer implements Runnable { 
    String prefix; 
    final Lock lock; 

    public Producer(String prefix, Lock lock) { 
     this.prefix = prefix; 
     this.lock = lock; 
    } 

    private void send() { 
     lock.lock(); 
     try{ 
      for(int i = 0; i < 10; i++){ 
       System.out.println(Thread.currentThread().getName() + " " + i); 
      } 
     }finally{ 
      lock.unlock(); 
     } 
    } 

    public void run() { 
     send(); 
    } 
} 
+0

이 어색는 ... 사람, 내 실수는 ... 나는 그들이 알고 자물쇠를 나눠 줘야 해 ... 그냥 ... 내가 게시하기 전에 다시 확인해야 해.하지만 어쨌든, 고마워. – cinqS

관련 문제