一、线程池的概念
- Java里面线程池的顶级接口是 java.util.concurrent.Executor ,但是严格意义上讲 Executor 并不是一个线程池,而只是一个执行线程的工具。
- 真正的线程池接口是 java.util.concurrent.ExecutorService 。
要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在 java.util.concurrent.Executors 线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。官方建议使用Executors工程类来创建线程池对象。
二、几种常用的线程池
public class ThreadPoolTest {
public static void main(String[] args) {
//1、固定线程数量
//ExecutorService threadPool = Executors.newFixedThreadPool(3);
//2、缓存线程池,如果线程不够,会再增加线程数量
//ExecutorService threadPool = Executors.newCachedThreadPool();
//3、单一线程池,如果一个线程死了,会重新再创建一个线程
ExecutorService threadPool = Executors.newSingleThreadExecutor();
//把任务交给线程池执行
for(int i = 1;i<=10;i++){
final int task = i;
threadPool.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int j = 1;j<=10;j++){
System.out.println(Thread.currentThread().getName()+" loop of "+ j +" Thread: "+ task);
}
}
});
}
//任务结束后关闭线程池,但一般不关闭
//threadPool.shutdown();
}
}
可以执行定时任务的线程池
public class ThreadPoolTest {
public static void main(String[] args) {
//可以执行定时任务的线程池
//ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
//threadPool.schedule(new Runnable() {
// @Override
// public void run() {
// System.out.println("bombing!");
// }
// }, 6, TimeUnit.SECONDS);
//固定频率的定时器
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("bombing!");
}
},6, 2,TimeUnit.SECONDS);
//如果需要实现每天凌晨3点执行定时任务,则只能通过Date.getTime - currentTimeMills的方法
}
}