奇妙な動作が見られるマルチスレッド プログラムを作成しました。以下はコードです。
class Task implements Runnable {
private Command command;
private BlockingQueue<Integer> existPool;
private BlockingQueue<Integer> newPool;
private int existId;
private int newId;
public Task(Command command, BlockingQueue<Integer> pool1, BlockingQueue<Integer> pool2) {
this.command = command;
this.existPool = pool1;
this.newPool = pool2;
}
public void run() {
if(command.getDataCriteria().equals(PDSLnPConstants.DATA_CRITERIA_PREVIOUS)) {
try {
// Getting existing id from the pool
existId = existPool.take();
attributeGetSetMethod(existId);
} catch (Exception e) {
getLogger().log(LogLevel.ERROR, e.getLocalizedMessage());
} finally {
// And releasing that existing ID for re-use
existPool.offer(existId);
}
}
//Something wrong happening here
else if(command.getDataCriteria().equals(PDSLnPConstants.DATA_CRITERIA_NEW)) {
try {
// Getting new id from the pool
newId = newPool.take();
attributeGetSetMethod(newId);
} catch (Exception e) {
getLogger().log(LogLevel.ERROR, e.getLocalizedMessage());
} finally {
// And releasing that new ID for re-use
newPool.offer(newId);
}
}
}
}
以下のコードから。上記の run メソッドが呼び出されています。
for (int i = startRange; i <= endRange; i++) {
availableExistingIds.add(i);
}
for (int n = newStartRange; n <= newEndRange; n++) {
availableNewIds.add(n);
}
BlockingQueue<Integer> existIdPool = new ArrayBlockingQueue<Integer>(11, false, availableExistingIds);
BlockingQueue<Integer> newIdPool = new ArrayBlockingQueue<Integer>(21, false, availableNewIds);
GUID_ID_MAPPING = new LinkedHashMap<Integer, LinkedHashMap<Integer, String>>();
long startTime = System.currentTimeMillis();
long endTime = startTime + (durationOfRun*60*1000L);
// Running for particular duration of time
while(System.currentTimeMillis() <= endTime) {
Command nextCommand = getNextCommandToExecute();
Task nextCommandExecutorRunnable = new Task(nextCommand, existIdPool, newIdPool);
executorService.submit(nextCommandExecutorRunnable); // Submit it for execution
}
問題文:-
私が気付いた奇妙なことの1つは、以下のelse ifループで、上記のコードがrunメソッドで表示if the command.getDataCriteria() is Previous
されている場合、else ifブロック(これはforですNew
)にも入力されます。チェックをしてい.equals
ますか?なぜこれが起こっているのですか?
else if(command.getDataCriteria().equals(PDSLnPConstants.DATA_CRITERIA_NEW)) {
アップデート:-
以下は私のコンソールからの画像です。
あなたははっきりと見ることができます、dataCriteria was New
そしてそれは行きましたPREVIOUS block