首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

折磨了几天的多线程有关问题 求大神

2013-01-17 
折磨了几天的多线程问题 求大神本帖最后由 ml774032194 于 2013-01-07 11:15:35 编辑多线程访问多个服务器

折磨了几天的多线程问题 求大神
本帖最后由 ml774032194 于 2013-01-07 11:15:35 编辑 多线程访问多个服务器并下载一个文件 并且跳转到一个页面显示下载结果
现在是在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<Serverproxy> serverproxyCheckList = new ArrayList<Serverproxy>();
public  boolean isSuccess=false;
public boolean getSuccess() {
return isSuccess;
}
public void setSuccess(boolean isSuccess) {
this.isSuccess = isSuccess;
}
//..其他代码
//开启线程的方法
public List<Serverproxy> check(List<Serverproxy> 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循环里的判断没有被触发
这个问题纠结几天了 判断的方法已经改了几次了 头发都想白了 求大神指教折磨了几天的多线程有关问题 求大神
多线程 JAVA 数据同步
[解决办法]
serverproxyResult:10.196.27.19:8080下载成功   不是都提示下载成功了吗?是不是你linux上的没有加那句日志打印啊
[解决办法]
我也想学java
[解决办法]
不可能不一样吧。 一般只有路径才会出现系统不兼容的情况

热点排行