コードは次のとおりです。
final CountDownLatch lineDirectionLatch = new CountDownLatch(count);
final Object lock = new Object();
for(StationLines station : stationList) {
final String gpsNumber = station.getGpsNumber();
for(String lineNumber : station.getLines()) {
final TranslateToStationTask task = new TranslateToStationTask(lineNumber, gpsNumber);
task.setCallback(new Runnable() {
@Override
public void run() {
synchronized (lock) {
Utils.debug(TAG, "Thead " + Thread.currentThread().getId() + " enter critical section.");
int errorCode = task.getTaskResult().getErrorCode();
if (errorCode == 0) {
Station station = task.getTaskResult().getContent();
if (station != null) {
for(int idx = 0; idx < stationList.size(); idx++) {
String gpsNumber = stationList.get(idx).getGpsNumber();
if (gpsNumber.equals(station.getGpsNumber())) {
stationList.get(idx).setDirection(station.getLineNumber(), station.getDirection());
}
}
}
}
Utils.debug(TAG, "Thead " + Thread.currentThread().getId() + " leave critical section.");
lineDirectionLatch.countDown();
}
}});
task.startTask();
}
}
lineDirectionLatch.await();
ここにログがあります:
03-26 19:57:07.648: I/TrafficManager(20013): Thead 1501 enter critical section.
03-26 19:57:07.687: I/TrafficManager(20013): Thead 1501 leave critical section.
03-26 19:57:07.714: I/TrafficManager(20013): Thead 1502 enter critical section.
03-26 19:57:07.722: I/TrafficManager(20013): Thead 1502 leave critical section.
03-26 19:57:07.726: I/TrafficManager(20013): Thead 1503 enter critical section.
03-26 19:57:07.726: I/TrafficManager(20013): Thead 1503 leave critical section.
03-26 19:57:07.769: I/TrafficManager(20013): Thead 1509 enter critical section.
03-26 19:57:07.773: I/TrafficManager(20013): Thead 1505 enter critical section.
03-26 19:57:07.773: I/TrafficManager(20013): Thead 1505 leave critical section.
03-26 19:57:07.804: I/TrafficManager(20013): Thead 1506 enter critical section.
03-26 19:57:07.804: I/TrafficManager(20013): Thead 1506 leave critical section.
03-26 19:57:07.804: I/TrafficManager(20013): Thead 1507 enter critical section.
03-26 19:57:07.804: I/TrafficManager(20013): Thead 1507 leave critical section.
03-26 19:57:07.804: I/TrafficManager(20013): Thead 1510 enter critical section.
03-26 19:57:07.843: I/TrafficManager(20013): Thead 1511 enter critical section.
03-26 19:57:07.843: I/TrafficManager(20013): Thead 1513 enter critical section.
スレッド1505が前に入力されたスレッド(1509)の前にクリティカルセクションに入り、スレッド1509がクリティカルセクションを離れることはありませんか?それは奇妙です。
すべてのTranslateToStationTaskは独自のスレッドで実行され、タスクが作業を終了するとクリティカルセクションが呼び出されます。
クリティカルセクションで複数のタスクが入ることができる理由と、一部のタスクがクリティカルセクションから出ないように見える理由がわかりません。