大家好,我再次发帖问类似问题了,感觉做进去了才知道问题很多!
    我做的项目采用多线程的方法实现,继承了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;

解决方案 »

  1.   

    具体代码:
    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());
    }
    }
      

  2.   

    join是对的,并不是说其它线程都顺序执行,而是主线程在等待所有线程的执行完成,而其它已经start的线程并不是串行执行的,而是并发执行的,如果你有多个CPU就会是并行执行。
      

  3.   


    顶一个jdk:
    public final void join(long millis)
                    throws InterruptedException等待该线程终止的时间最长为 millis 毫秒。超时为 0 意味着要一直等下去。 参数:
    millis - 以毫秒为单位的等待时间。 不过实际returnThreadCount不一定与threadCount相等
      

  4.   

    谢谢大家,我已经搞定了。我那样写是错的,和单线程基本没区别,正确的写法是先把全部线程都创建完,让他们都跑起来,然后再join()它们。伪代码如下:
    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();
    }