Java 1.5 开始,提供了线程池供大家使用,功能还挺全的。下面是一个简单的例子。复杂的例子将放在后面几篇博客中。
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* 固定大小线程池
*
* @author yiding.he
*/
public class FixedThreadPoolDemo {
public static void main(String[] args) {
// 创建一个最多同时运行 3 个任务的线程池
ExecutorService service = Executors.newFixedThreadPool(3);
System.out.println("线程池已创建");
// 安排若干个任务运行
for (int i = 0; i < 15; i++) {
service.execute(new RunnableImpl(i + 1));
}
System.out.println("任务已提交到线程池");
// 结束线程池。shutdown() 不会马上结束,而是等所有安排的任务执行完才结束。
service.shutdown();
// 如果不想马上结束,又不愿意等太长时间,那么可以调用 awaitTermination() 方法等待一段时间
try {
System.err.println("线程池已关闭,开始等待...");
service.awaitTermination(5, TimeUnit.SECONDS);
System.err.println("等待时间已过");
// shutdownNow() 将放弃所有正在等待的任务,等当前执行的任务全部完成之后,结束线程池。
List<Runnable> abandoned = service.shutdownNow();
System.err.println("被遗弃的任务:" + abandoned);
} catch (InterruptedException e) {
e.printStackTrace();
System.exit(-1);
}
}
/**
* 要执行的任务封装
*/
private static class RunnableImpl implements Runnable {
private int id;
private RunnableImpl(int id) {
this.id = id;
}
public void run() {
System.out.println("开始执行任务" + id);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// nothing to do
}
System.out.println("任务" + id + "执行完毕。");
}
@Override
public String toString() {
return "任务" + id;
}
}
}
下面是执行输出的例子:
线程池已创建
任务已提交到线程池
开始执行任务1
开始执行任务3
开始执行任务2
线程池已关闭,开始等待...
任务1执行完毕。
任务3执行完毕。
任务2执行完毕。
开始执行任务5
开始执行任务4
开始执行任务6
任务4执行完毕。
任务6执行完毕。
开始执行任务7
任务5执行完毕。
开始执行任务8
开始执行任务9
等待时间已过
被遗弃的任务:[任务10, 任务11, 任务12, 任务13, 任务14, 任务15]
任务9执行完毕。
任务8执行完毕。
任务7执行完毕。