一个奇怪的多线程问题,求解! 本帖最后由 czuopeng 于 2011-04-26 17:03:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 初步判断是 public int getRetryCount() 加上synchronized 另外, 对于retryCount变量不要直接使用,请改成getRetryCount() /** * 是否可以重试 */ public boolean canRetry() { int currentRetryCount = retryCount + 1; //例如此处 if (currentRetryCount <= maxRetryCount) { retryCount = currentRetryCount; return true; } return false; } 可以说下原因吗?同步对retryCount的访问?可是int类型原子的呀?如果说要同步,也应该同步canRetry方法吧?按你说的修改了下:执行结果:Thread-0 - --------start---------pool-1-thread-1 - test_1pool-1-thread-1 - error:0pool-1-thread-2 - test_1pool-1-thread-2 - error:1Thread-0 - while condition:trueThread-0 - --------end--------- 在DEMO代码,对应队列中的同一个消息,同时只会有一个线程处理,所以对于同一个Message实例不会存在并发访问的情况。 其实奇怪在“Thread-0 - while condition:true”,这个地方,这个是在while退出后打印出来的,本来此处应该输入“while condition:false”的,因为此时循环退出了,循环条件应该时不满足。 帮你在WINDOW上测试了好几次,结果和你预期的一样。建议搜索Linux系统上多线程与WINDOW的区别。 我用myeclipse执行的。没出现错。 UP下,继续呼唤牛中这个问题貌似只会出现在LINUX中。 怎样从class文件中取得方法名并存入文件中 J2SE中用byte[]创建Image的问题 请问可以得到当前的类吗? 谁在开发中使用过比较复杂的TableCellRenderer? 集合的增加,删除 高手请进,一个奇怪的问题! 属性文件的读取 重载和覆盖的好处 关于JAVA的发展 新手问个jdk源码的问题 关于字符排列。。 怎样让Jcombobox下拉框的内容从数据库中查询出来 请教高手!
public int getRetryCount() 加上synchronized 另外, 对于retryCount变量不要直接使用,请改成getRetryCount() /**
* 是否可以重试
*/
public boolean canRetry() {
int currentRetryCount = retryCount + 1; //例如此处
if (currentRetryCount <= maxRetryCount) {
retryCount = currentRetryCount;
return true;
}
return false;
}
Thread-0 - --------start---------
pool-1-thread-1 - test_1
pool-1-thread-1 - error:0
pool-1-thread-2 - test_1
pool-1-thread-2 - error:1
Thread-0 - while condition:true
Thread-0 - --------end--------- 在DEMO代码,对应队列中的同一个消息,同时只会有一个线程处理,所以对于同一个Message实例不会存在并发访问的情况。 其实奇怪在“Thread-0 - while condition:true”,这个地方,这个是在while退出后打印出来的,本来此处应该输入“while condition:false”的,因为此时循环退出了,循环条件应该时不满足。
建议搜索Linux系统上多线程与WINDOW的区别。
这个问题貌似只会出现在LINUX中。