首页 / JAVA / Java批评部分似乎不起作用
Java批评部分似乎不起作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java批评部分似乎不起作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3054字,纯文字阅读大概需要5分钟。
内容图文
![Java批评部分似乎不起作用](/upload/InfoBanner/zyjiaocheng/816/579e58648214453a811e43f33fcbc939.jpg)
这是代码:
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是日志:
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都在它自己的线程中运行,当任务完成它的工作时,将调用临界区.
我不知道为什么关键部分允许多个任务进入,以及为什么有些任务似乎永远不会离开关键部分?
解决方法:
请在synchronized块中添加一个try-catch子句,以查看函数是否异常,因此在不事先通知的情况下解锁对象.
像这样的东西:
synchronized(lock) {
try {
// my code
}
catch (Exception e) { // generic catch to look if any exception is triggered
System.out.printf("Caused exception: %s",e.getMessage());
}
}
另一个可能的问题是您使用新的Runnable()创建一个匿名类,因此锁可能并不总是相同的变量.尝试创建一个实现Runnable的类以及lock变量并调用该构造函数.
内容总结
以上是互联网集市为您收集整理的Java批评部分似乎不起作用全部内容,希望文章能够帮你解决Java批评部分似乎不起作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。