1.FixedThreadPool
定长线程池,只会根据初始设置创建定长的线程数,当有新的任务时,有空闲线程则执行任务,没有空闲线程则加入队列,等待工作线程执行完成。
public class FixedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 20; i++) {
final int temp = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
// 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
executorService.shutdown();
}
}
2.CachedThreadPool
线程池为无限大,当有新的任务时,会看是否有空闲线程,有则使用空闲线程,而不再创建新线程;如果没有空闲线程,则会创建一个新的线程执行任务。
public class CachedThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 1; i <= 20; i++) {
final int temp = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
}
});
}
// 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
executorService.shutdown();
}
}
3.SingleThreadExecutor
创建唯一的工作线程来执行任务,如果线程异常结束,会有另一个线程取代它,相当于单线程。
public class SingleThreadExecutorDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 1; i <= 20; i++) {
final int temp = i;
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
}
});
}
// 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
executorService.shutdown();
}
}
4.ScheduledThreadPool
定时或者周期性的工作调度。
public class ScheduledThreadPoolDemo {
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5);
for (int i = 1; i <= 20; i++) {
final int temp = i;
executorService.schedule(new Runnable() {
@Override
public void run() {
System.out.println("i = " + temp + ",当前线程:" + Thread.currentThread().getName());
}
}, 3, TimeUnit.SECONDS);
}
// 线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
executorService.shutdown();
}
}