关于网友提出的“ 折磨了几天的多线程问题 求大神”问题疑问,本网通过在网上对“ 折磨了几天的多线程问题 求大神”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 折磨了几天的多线程问题 求大神
描述:本帖最后由 ml774032194 于 2013-01-07 11:15:35 编辑
多线程JAVA数据同步
多线程访问多个服务器并下载一个文件 并且跳转到一个页面显示下载结果
现在是在windows上程序是能正常运行的,但是我把项目部署到Linux服务器上时 出现了问题
下面是代码:
public class TestThread implements Runnable {
public Serverproxy serverproxy;
/>
private TestITDSDownload ts;
public TestThread(Serverproxy serverproxy,TestITDSDownload tsd) {
this.serverproxy = serverproxy;
this.ts=tsd;
}
public void run() {
try {
int result=ts.getITDSStatus(serverproxy.getIp(),
serrverproxy.getFileId());//下载的方法会返回一个int类型判断是否下载成功
if(result==1)
{serverproxy.setResult("下载成功");}
/>
if(result==2)
{serverproxy.setResult("下载失败");}
if(result==4)
{serverproxy.setResult("内部错误");} System.out.println("serverproxyResult:"+serverproxy.getIp()+serverproxy.getResult());
System.out.println("size为:"+TestITDSDownload.getSize());
System.out.println("结果添加前的serverproxyCheckList的长度:"+ts.serverproxyCheckList.size());
ts.serverproxyCheckList.add(serverproxy);
System.out.println("结果添加后的serverproxyCheckList的长度:"+ts.serverproxyCheckList.size());
System.out.println("现在的isSuccess为:"+ts.getSuccess());
if(ts.serverproxyCheckList.size()==TestITDSDownload.getSize()){
ts.setSuccess(true);
System.out.println("相等,isSuccess为:"+ts.getSuccess());
}
}
} catch (Exception e) {<>
// TODO Auto-generated catch block
}
}
}
serverproxy:服务器对象 保存的是服务器的IP,端口和下载结果
线程里访问传进来的服务器,然后去下载内容 并将下载结果 添加到对应的serverproxy对象中
public class TestITDSDownload {
public List serverproxyCheckList = new ArrayList();
public boolean isSuccess=false;
public boolean getSuccess() {
return isSuccess;
}
public void setSuccess(boolean isSuccess) {
this.isSuccess = isSuccess;
}
//..其他代码
//开启线程的方法<>
public List check(List serverproxyList) throws Exception {
TestITDSDownload.setSize(serverproxyList.size());
for (int i = 0; i < serverproxyList.size(); i++) {
TestThread t = new TestThread(serverproxyList.get(i),this);
Thread thread = new Thread(t);
thread.start();
}
while(true){
if(getSuccess()){ <>
System.out.println("成功!当前isSuccess为:"+getSuccess());
break;
}
}
return serverproxyCheckList;
}
}
/>
我在Action里调用这个方法 并且传一个服务器信息的集合进来
遍历集合然后多线程访问每个服务器
serverproxyCheckList :存放下载完成的结果
我在线程里执行完下载后 把结果存入到serverproxyCheckList
然后有一个判断 当结果集合的长度和我传进来的 服务器的集合长度相等时 说明所有服务器的结果都返回了
这里这样做是因为 在下载的方法里有一个限制 当我下载失败时 会等待30~40秒的时间才会返回下载结果
所以我在check()方法里加了个永真循环来等我的isSuccess的值发生改变
我在windows下程序是正常的
但是在Linux下时 isSuccess在线程里改变后 循环里的还是没变<>
windows运行结果:
serverproxyResult:10.192.27.54:8080下载成功
size为:1
结果添加前的serverproxyCheckList的长度:0
结果添加后的serverproxyCheckList的长度:1<>
现在的isSuccess为:false
相等,isSuccess为:true
/>
成功!当前isSuccess为:true
---------------------------------------
/>
Linux运行结果:
serverproxyResult:10.196.27.19:8080下载成功
size为:1
结果添加前的serverproxyCheckList的长度:0
结果添加后的serverproxyCheckList的长度:1
现在的isSuccess为:false
相等,isSuccess为:true
-----------------------------------
这里可以看出 线程里 isSuccess已经变成了true
但是 while循环里的判断没有被触发
这个问题纠结几天了 判断的方法已经改了几次了 头发都想白了 求大神指教

解决方案1: 不可能不一样吧。 一般只有路径才会出现系统不兼容的情况
解决方案2: 我也想学java
解决方案3: serverproxyResult:10.196.27.19:8080下载成功 不是都提示下载成功了吗?是不是你linux上的没有加那句日志打印啊
以上介绍了“ 折磨了几天的多线程问题 求大神”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2124512.html