package com.java;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
abstract class AbstractSql {
public abstract void execute();
}
class Sql extends AbstractSql {
private String sql;
public Sql(String sql) {
this.sql = sql;
}
public String getSql() {
return sql;
}
public void execute() {
try {
System.out.println(sql + " is executing...");
Thread.sleep(5000);
System.out.println(sql + " executed!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Result {
private Sql sql;
public Result(Sql sql) {
this.sql = sql;
}
public String get() {
return sql.getSql() + " 's result!";
}
}
class Aggregation extends AbstractSql {
private List<Sql> sqllist;
private CountDownLatch latch;
private List<Result> results;
public Aggregation(List<Sql> sqllist) {
if (sqllist == null || sqllist.size() < 1) {
throw new IllegalArgumentException("no sql");
}
this.sqllist = sqllist;
latch = new CountDownLatch(sqllist.size());
results = new ArrayList<Result>();
}
private class WaitForResult extends Thread {
private Aggregation aggregator;
private Sql sql;
public WaitForResult(Sql sql, Aggregation aggregator) {
this.sql = sql;
this.aggregator = aggregator;
}
public void run() {
sql.execute();
aggregator.results.add(new Result(sql));
latch.countDown();
}
}
private List<Result> forResult() {
for (final Sql sql : sqllist) {
new WaitForResult(sql, this).start();
}
return results;
}
private Thread waitForResult() throws InterruptedException {
Thread t = new Thread() {
public void run() {
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
t.start();
return t;
}
private void aggregate() throws InterruptedException {
Thread t = waitForResult();
List<Result> results = forResult();
t.join();
for (Result result : results) {
System.out.println(result.get());
}
System.out.println("all results aggregated!!!");
}
@Override
public void execute() {
try {
aggregate();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class CountDownLatchTest {
public static void main(String[] args) throws Exception {
List<Sql> sqllist = new ArrayList<Sql>();
sqllist.add(new Sql("select 1 from 1"));
sqllist.add(new Sql("select 2 from 2"));
sqllist.add(new Sql("select 3 from 3"));
sqllist.add(new Sql("select 4 from 4"));
sqllist.add(new Sql("select 5 from 5"));
Aggregation agg = new Aggregation(sqllist);
agg.execute();
}
}
运行结果:
select 1 from 1 is executing...
select 3 from 3 is executing...
select 5 from 5 is executing...
select 4 from 4 is executing...
select 2 from 2 is executing...
select 1 from 1 executed!
select 3 from 3 executed!
select 5 from 5 executed!
select 4 from 4 executed!
select 2 from 2 executed!
select 1 from 1 's result!
select 3 from 3 's result!
select 5 from 5 's result!
select 4 from 4 's result!
select 2 from 2 's result!
all results aggregated!!!