java 多个线程执行完以后返回结果

// ControlMaster 为管理线程类

public final class ControlMaster
{
  private boolean exiting = false;
  private List listSlave = new ArrayList();

  public void joinSlave(ControlSlave s) { if (s == null)
      return;
    synchronized (this) {
      if (this.listSlave.contains(s))
        return;
      this.listSlave.add(s);
    }
    s.joinMaster(this); }

  public void exiting() {
    this.exiting = true;
    synchronized (this) {
      notifyAll();
    }
  }

  public void safeDone() {
    synchronized (this) {
      do {
        try {
          wait();
        }
        catch (Exception localException)
        {
        }
        if (this.exiting) break;
      }while (this.listSlave.size() > 0);
    }
  }

  final void slaveDone(ControlSlave s)
  {
    synchronized (this) {
      this.listSlave.remove(s);
      notifyAll();
    }
  }
}

 

// SlaveThread类为子线程的父类

public abstract class SlaveThread extends Thread
{
  private ControlSlave m_ControlSlave = new ControlSlave();

  public final void joinMaster(ControlMaster m) {
    m.joinSlave(this.m_ControlSlave);
  }
  public final void run() {
    try {
      slaveRun();
    } finally {
      this.m_ControlSlave.done();
    }
  }

  public abstract void slaveRun();
}

 

 

//   子线程关联到管理类

public final class ControlSlave
{
  private List listMaster = new ArrayList();

  public void joinMaster(ControlMaster m) {
    if (m == null)
      return;
    synchronized (this) {
      if (this.listMaster.contains(m))
        return;
      this.listMaster.add(m);
    }
    m.joinSlave(this);
  }
  public final void done() {
    synchronized (this) {
      for (int i = 0; i < this.listMaster.size(); i++) {
        ((ControlMaster)this.listMaster.get(i)).slaveDone(this);
      }
      this.listMaster.clear();
    }
  }
}

 
//测试

public class TestControlMaster {  
    public static void main(String[] args) throws IOException {
     
     // 注册管理对象
     ControlMaster tControlMaster = new ControlMaster();
     
     /*
      * 比如1辆大货车拉80箱货,去果园拉新鲜水果。需要采摘苹果24箱,梨30箱,橘子26箱,全部采摘完装车才可以走
      */
     
     //一部分人采摘苹果
     AppleThread appleThread = new AppleThread();
     // 采摘苹果线程注入到管理类中
     appleThread.joinMaster(tControlMaster);
     appleThread.start();
     
       //一部分人采摘梨
     PearThread pearThread = new PearThread();
     pearThread.joinMaster(tControlMaster);
     pearThread.start();
     
      //一部分人采摘橘子
     OrangeThread orangeThread = new OrangeThread();
     orangeThread.joinMaster(tControlMaster);
     orangeThread.start();
     
     //等待上面线程处理结束
  tControlMaster.safeDone();
  
  System.out.println("大货车启动运往超市....");
     
    } 
   
   
 private static class AppleThread extends SlaveThread
 {
  public void slaveRun() {
        System.out.println("采摘24箱苹果");
  }
 }
   
 private static class PearThread extends SlaveThread
 {
  public void slaveRun() {
        System.out.println("采摘30箱梨");
  }
 }
 
 private static class OrangeThread extends SlaveThread
 {
  public void slaveRun() {
        System.out.println("采摘26箱橘子");
  }
 }
 
}

posted @ 2015-04-20 17:02  跳跳虎  阅读(1829)  评论(0)    收藏  举报