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。
謝謝。
這很尷尬......男人,我的錯......我知道他們應該共享一個鎖...我只是...我應該仔細檢查它,然後再發布它...但是,無論如何,謝謝... – cinqS