Here is the code:
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();
Herer is the journal:
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.
You can see that Thread 1505 enters the critical section from the previously entered thread (1509), and thread 1509 never leaves the critical section? This is strange.
Each TranslateToStationTask starts in its thread, and the critical section will be called when the task completes.
I have no idea why the critical section allows you to enter multiple tasks and why some tasks seem never to leave the critical section?
source share