大家好,我再次发帖问类似问题了,感觉做进去了才知道问题很多!
我做的项目采用多线程的方法实现,继承了Runnable接口,因此存在如何让各个子线程向主线程返回数据的问题。(由于项目用JDK1.4开发,因此不支持能够返回数据的Callable接口);
还有将各个子线程返回的List类型数据需要整合到一个更大的List变量中,但是存在问题是如何让主线程暂停执行,等全部的子线程执行结束并返回结果后,主线程再把值传递给别的函数。
如果给在每个线程启动后,都使用join()函数,那岂不和单线程一样了吗,都是启动一个线程执行完毕再启动下一个线程, 到最后输出结果。部分代码如下,大家帮我看看有啥问题,能够咋样修改,谢谢! //启动threadCount个线程
for (int i = 0; i < threadCount; i++) {
String startIpAddress = IpConversion.long2Ip(IpConversion
.ip2Long(ipAddress)
+ i * ipNumInEachThread);
MySocketThread run = new MySocketThread(startIpAddress,
ipNumInEachThread, oldSnmpcards, snmpcards, new Integer(i));
Thread tt = new Thread(run);
tt.start();
try{
tt.join(500);
}catch(Exception e)
{}
} int returnThreadCount = 0; //已返回结果的进程个数 //将子线程的返回结果存储到主线程,并且计算当已返回结果子线程数目等于分配的子线程数目时,主线程将结果返回到其它函数,然后就执行完毕。
while ("finished".equals(snmpcards.get("status"))
&& returnThreadCount <= threadCount) {
List tempcards = (List) snmpcards.get("result");
for (int i = 0; i < tempcards.size(); i++) {
Map tempSnmp = (Map) tempcards.get(i);
temp.add(tempSnmp); //将子线程的结果保存到主线程的temp中;
}
returnThreadCount++; //统计已返回结果的线程数目
snmpcards.clear(); //清空用于保存子线程扫描结果的Hashtable
if(returnThreadCount == threadCount) //如果返回结果的进程数和分配的进程数相等,则返回结果
{
break;
}
}
return temp;
我做的项目采用多线程的方法实现,继承了Runnable接口,因此存在如何让各个子线程向主线程返回数据的问题。(由于项目用JDK1.4开发,因此不支持能够返回数据的Callable接口);
还有将各个子线程返回的List类型数据需要整合到一个更大的List变量中,但是存在问题是如何让主线程暂停执行,等全部的子线程执行结束并返回结果后,主线程再把值传递给别的函数。
如果给在每个线程启动后,都使用join()函数,那岂不和单线程一样了吗,都是启动一个线程执行完毕再启动下一个线程, 到最后输出结果。部分代码如下,大家帮我看看有啥问题,能够咋样修改,谢谢! //启动threadCount个线程
for (int i = 0; i < threadCount; i++) {
String startIpAddress = IpConversion.long2Ip(IpConversion
.ip2Long(ipAddress)
+ i * ipNumInEachThread);
MySocketThread run = new MySocketThread(startIpAddress,
ipNumInEachThread, oldSnmpcards, snmpcards, new Integer(i));
Thread tt = new Thread(run);
tt.start();
try{
tt.join(500);
}catch(Exception e)
{}
} int returnThreadCount = 0; //已返回结果的进程个数 //将子线程的返回结果存储到主线程,并且计算当已返回结果子线程数目等于分配的子线程数目时,主线程将结果返回到其它函数,然后就执行完毕。
while ("finished".equals(snmpcards.get("status"))
&& returnThreadCount <= threadCount) {
List tempcards = (List) snmpcards.get("result");
for (int i = 0; i < tempcards.size(); i++) {
Map tempSnmp = (Map) tempcards.get(i);
temp.add(tempSnmp); //将子线程的结果保存到主线程的temp中;
}
returnThreadCount++; //统计已返回结果的线程数目
snmpcards.clear(); //清空用于保存子线程扫描结果的Hashtable
if(returnThreadCount == threadCount) //如果返回结果的进程数和分配的进程数相等,则返回结果
{
break;
}
}
return temp;
解决方案 »
- 跪求SSH框架分页每条记录多就卡的问题??
- 求助:在线后台管理页面的刷新机制有哪些?J2EE中一般怎么实现?
- 跪求毕业论文设计意见
- JAVA中的单子模式
- hibernate多表查询问题
- 一个logic:iterate嵌套使用的问题,早上上班弄到现在没搞定,希望在吃饭前能成功!
- 使用spring,如何封装以下代码?
- 求高手指点
- 请教大侠们 用tomcat 配置了一个连接池 经常出现 Cannot get a connection, pool exhausted,这是为什么?
- 谁知道哪里有下载isapi_redirect.dll?
- 请教验证码原理
- 求 Java 多线程 Runnable接口 返回值的问题
package cn.tyb.thread;public class ThreadJoin extends Thread{
private String type;
private Object o;
public ThreadJoin(String type){
this.type=type;
}
public void run(){
//测试代码
int i=0;
while(true){
if(i>=10){
break;
}
System.out.println(type+": "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
//要放回的值
o=i;
}
public Object get(){
try {
//若该线程已经执行完了,则返回o
this.join();
return o;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws InterruptedException{
ThreadJoin tj1 = new ThreadJoin("A");
ThreadJoin tj2 = new ThreadJoin("B");
//这里可以开n个线程
tj1.start();
tj2.start();
//线程开完之后再调用获取返回值的方法
System.out.println(tj1.get());
System.out.println(tj2.get());
}
}
顶一个jdk:
public final void join(long millis)
throws InterruptedException等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。 参数:
millis - 以毫秒为单位的等待时间。 不过实际returnThreadCount不一定与threadCount相等
List threadList = new ArrayList();for(int i = 0; i < threadcount; i++)
{
myThread run = myThread("传递参数");
Thread tt = new Thread(run);
tt.start();
threadList.add(tt);
}for(int i = 0; i < threadList.size();i++)
{
((Thread)threadList.get(i)).join();
}