2016-06-30 29 views
0

我想在我的SpringXD工作中添加ReentrantLock,但它有時似乎跨線程中斷。爲什麼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 

什麼是錯?這個鎖在Eclipse上的localhost上運行良好,經過測試。

是因爲SpringXD是分佈式系統嗎?但我只有一個xdcontaier連接到我的xdadmin。

謝謝。

回答

3

你應該通過你的ReentrantLock在每一個新Runnable沒有創造它時,生產者應該分享一個ReentrantLock,如:

@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

相關問題