CountDownLatch复杂点的例子
public class CountDownLatchTest2 {
private static Random random = new Random(System.currentTimeMillis());
static class Event {
int id;
Event(int id) {
this.id = id;
}
}
static class TaskBatch {
private CountDownLatch latch;
private EventBatch eventBatch;
private Table table;
TaskBatch(Table table, int size, EventBatch eventBatch) {
latch = new CountDownLatch(size);
this.eventBatch = eventBatch;
this.table = table;
}
public void done() {
latch.countDown();
if (latch.getCount() == 0) {
System.out.println("the table " + table.name + " has finished [ " + table + " ]");
eventBatch.done();
}
}
}
static class EventBatch {
private CountDownLatch latch;
private Event event;
EventBatch(int size, Event event) {
this.latch = new CountDownLatch(size);
this.event = event;
}
public void done() {
latch.countDown();
if (latch.getCount() == 0) {
System.out.println(" ====== all of tables done in event " + event.id);
}
}
}
static class Table {
String name;
long sourceRecordCount;
long targetRecordCount;
String sourceColumnSchema;
String targetColumnSchema;
Table(String name, long sourceRecordCount) {
this.name = name;
this.sourceRecordCount = sourceRecordCount;
}
@Override
public String toString() {
return "Table{" +
"name='" + name + '\'' +
", sourceRecordCount=" + sourceRecordCount +
", targetRecordCount=" + targetRecordCount +
", sourceColumnSchema='" + sourceColumnSchema + '\'' +
", targetColumnSchema='" + targetColumnSchema + '\'' +
'}';
}
}
private static List<Table> capture(Event event) {
List<Table> list = new ArrayList<Table>();
for (int i = 0; i < 10; i++) {
list.add(new Table("table-" + event.id + "-" + i, i * 1000));
}
return list;
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(5);
Event[] events = {new Event(1), new Event(2)};
for (Event event : events) {
List<Table> tables = capture(event);
EventBatch eventBatch = new EventBatch(tables.size(), event);
for (Table table : tables) {
TaskBatch taskBatch = new TaskBatch(table, 2, eventBatch);
TrustSourceRecordCount trustSourceRecordCount = new TrustSourceRecordCount(table, taskBatch);
TrustSourceColumnSchema trustSourceColumnSchema = new TrustSourceColumnSchema(table, taskBatch);
executorService.submit(trustSourceRecordCount);
executorService.submit(trustSourceColumnSchema);
}
}
}
static class TrustSourceRecordCount implements Runnable {
private Table table;
private TaskBatch taskBatch;
TrustSourceRecordCount(Table table, TaskBatch taskBatch) {
this.table = table;
this.taskBatch = taskBatch;
}
@Override
public void run() {
try {
Thread.sleep(random.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
table.targetRecordCount = table.sourceRecordCount;
// System.out.println("table "+table.name + " target recordCount have done and update the data");
taskBatch.done();
}
}
static class TrustSourceColumnSchema implements Runnable {
private Table table;
private TaskBatch taskBatch;
TrustSourceColumnSchema(Table table, TaskBatch taskBatch) {
this.table = table;
this.taskBatch = taskBatch;
}
@Override
public void run() {
try {
Thread.sleep(random.nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
table.targetColumnSchema = table.sourceColumnSchema;
// System.out.println("table "+table.name + " target columnSchema have done and update the data");
taskBatch.done();
}
}
}