0

奇妙な動作が見られるマルチスレッド プログラムを作成しました。以下はコードです。

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

4

1 に答える 1

1

あなたのコードが本当に

if(command.getDataCriteria().equals(PDSLnPConstants.DATA_CRITERIA_PREVIOUS)) {
   ...
else if(command.getDataCriteria().equals(PDSLnPConstants.DATA_CRITERIA_NEW)) {
   ...
}

その場合、両方...の s を実行することはできません。同期、スレッド、equals の不適切な実装などには依存しません。あなたが理解していない何かがあります (それは実際に両方にある同じ run() 呼び出しですか?)、またはおそらくあなたの問題ステートメントについて私が理解していない何かがあります (これはかなり混乱しています)。

于 2012-08-18T23:25:54.290 に答える