public void work() throws Exception
{
  while( ...... )
  {      Collection list = getList(); //      if( list!=null && !list.isEmpty() )
      {
          ThreadWork w = new ThreadWork(10, list);  //用10个线程处理这个list
          pwork.start();
      }
       System.out.println("abc");
     //这里10个线程没有处理完这个list,就打印了abc。我希望在这10个线程处理完list后,才打印abc,并且while()得到下一个list,请问要如何做呢?
   }}

解决方案 »

  1.   

    public void work() throws Exception
    {
      while( ...... )
      {      Collection list = getList(); //
          ArrayList workingThreads = new ArrayList();      if( list!=null && !list.isEmpty() )
          {
              ThreadWork w = new ThreadWork(10, list);  //用10个线程处理这个list
              pwork.start();
              workingThreads.add(w);
          }
          for (int i=0; i<workingThreads.size(); i++) {
              while (((Thread)workingThread.get(i)).isAlive())
                  Thread.currentThread().yield();
          }
          System.out.println("abc");
       }
    }
      

  2.   

    楼上这样循环检查所有的线程代价太高昂。
    不如在每个线程最后对一个声明为volatile的静态变量或者单例变量加1。
    主线程循环检查该变量,如果小于10,就wait(1)。等于10就表示所有子线程执行完毕
      

  3.   

    for (int i=0; i<workingThreads.size(); i++) {
              ((Thread)workingThread.get(i)).join();
          }
      

  4.   

    pwork.start();where is pwork defined?  s
      

  5.   

    package org.ibis.test;public class ThreadTest1 {
      Object notify = new Object();
      
      public static void main(String[] args) throws Exception {
        (new ThreadTest1()).work();
      }
      
      void work() throws Exception {
        int group = 5;
        while(group > 0) {  
          (new ThreadFactory(group, 10)).start();
          
          Thread.sleep(100);
          group--;
        }
      }
    }class ThreadFactory {
      int counter = 0;
      int group = 0;
      Thread[] runningThreads = null;
      
      ThreadFactory(int group, int counter) {
        this.counter = counter;
        this.group = group;
        runningThreads = new ThreadWorker[counter];
      }
      
      void start() throws Exception {
        for (int i =0 ; i < this.counter; i++) {
          runningThreads[i] = new ThreadWorker(group, i);
          runningThreads[i].start();
        }
        
        for(int i =0 ; i < this.counter; i++) {
          runningThreads[i].join();
        }
      }
      
    }
    class ThreadWorker extends Thread {
      int index = 0;
      int group = 0;
      ThreadWorker(int group, int index) {
        this.index = index;
        this.group = group;
      }
      
      public void run() {
        try{
          sleep(1000);
          System.out.println(this.group + "-" + this.index);
        }
        catch(InterruptedException ex) {
          System.out.print(this.group + "-" + this.index + " interrupted.");
        }
      }
    }
      

  6.   

    ChDw(米), ibiswang(神鸟) 有理:
      ((Thread)workingThread.get(i)).join();much better this. 受教育了。