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箱橘子");
}
}
}
浙公网安备 33010602011771号