最近有一个活,需要调度一些任务(Task),然后每个任务需要多线程运行它的子任务(thread)。最近学习java.util.concurrent的东西,于是使用里面的类实现了这样一个功能
用到的主要是Executors.newFixedThreadPool 就是一个固定大小的线程池
还有就是CountDownLatch 用来同步 测试的代码如下,看里面的代码和注释就比较清楚了。
public static void Test2() {
ExecutorService tasks = Executors.newFixedThreadPool(5); //最多同时执行5个任务的任务线程池。
List<String> allTasks = new ArrayList<String> (); //模拟20个任务
for (int i = 0; i < 20; i++) {
allTasks.add("Task" + i);
}
final CountDownLatch taskLatch = new CountDownLatch(allTasks.size()); //用来同步的信号量
for (int i = 0; i < allTasks.size(); i++) { //对于每一个任务
final String task = allTasks.get(i);
final List<String> allThreads = new ArrayList<String> (); //模拟每个任务的子任务(线程)。
for (int j = 0; j < 5; j++) {
allThreads.add("thread" + j);
}
final CountDownLatch threadLatch = new CountDownLatch(allThreads.size()); //子任务的同步
tasks.execute(new Runnable() { //启动所有任务
public void run() {
logger.info("Start Task: " + task); //实际任务开始
ExecutorService threads = Executors.newFixedThreadPool(2); //每个任务有两个线程的线程池
for (String th : allThreads) {
Runnable thread = new CheckThread2(task, th,threadLatch);
threads.execute(thread);
}
try {
threadLatch.await(); //等待子任务完成
}
catch (InterruptedException ex) {
}
taskLatch.countDown(); //通知别人,这个任务完成
threads.shutdownNow(); //本任务完成了,可以关闭线程池
logger.info(task + " finished.");
}
});
}
try {
taskLatch.await(); //等待所有任务完成
}
catch (InterruptedException ex) {
}
logger.info("All Tasks Finished.");
tasks.shutdownNow(); //所有任务完成了,可以关闭线程池了。
}
class CheckThread2
implements Runnable {
private String task;
private String thread;
private CountDownLatch threadLatch;
public CheckThread2(String task, String thread,CountDownLatch threadLatch) {
this.task=task;
this.thread=thread;
this.threadLatch=threadLatch;
}
public void run() {
System.out.println("starting " + task + "->" + thread); //任务的子任务实际开始
try {
Thread.sleep(new java.util.Random().nextInt(10) * 1000); //模拟一个费时的任务
}
catch (InterruptedException ex) {
}
System.out.println("finishing " + task + "->" + thread); //任务完成
this.threadLatch.countDown(); //通知任务,本子任务完成了。
}
}