newCachedThreadPool: 可缓存线程池,可灵活回收空闲线程
newFixedThreadPool: 定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待
newScheduledThreadPool: 定时线程池,支持定时和周期性任务的执行
newSingleThreadExecutor: 单线程化的线程池,保证所有任务按照指定顺序(先入先出,优先级等)执行
newCachedThreadPool
package com.mmall.concurrency.example.threadPool;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Slf4j
public class ThreadPoolExample1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
log.info("task:{}", index);
}
});
}
executorService.shutdown();
}
}
// 输出
10:57:37.683 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:0
10:57:37.683 [pool-1-thread-8] INFO c.m.c.example.threadPool.test9 - task:7
10:57:37.683 [pool-1-thread-6] INFO c.m.c.example.threadPool.test9 - task:5
10:57:37.683 [pool-1-thread-10] INFO c.m.c.example.threadPool.test9 - task:9
10:57:37.683 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:2
10:57:37.683 [pool-1-thread-9] INFO c.m.c.example.threadPool.test9 - task:8
10:57:37.683 [pool-1-thread-4] INFO c.m.c.example.threadPool.test9 - task:3
10:57:37.683 [pool-1-thread-5] INFO c.m.c.example.threadPool.test9 - task:4
10:57:37.683 [pool-1-thread-2] INFO c.m.c.example.threadPool.test9 - task:1
10:57:37.683 [pool-1-thread-7] INFO c.m.c.example.threadPool.test9 - task:6
Process finished with exit code 0
newFixedThreadPool
package com.mmall.concurrency.example.threadPool;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Slf4j
public class ThreadPoolExample2 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
log.info("task:{}", index);
}
});
}
executorService.shutdown();
}
}
// 输出
11:06:59.613 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:2
11:06:59.613 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:0
11:06:59.613 [pool-1-thread-2] INFO c.m.c.example.threadPool.test9 - task:1
11:06:59.617 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:3
11:06:59.617 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:6
11:06:59.617 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:4
11:06:59.617 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:7
11:06:59.618 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:8
11:06:59.617 [pool-1-thread-2] INFO c.m.c.example.threadPool.test9 - task:5
11:06:59.618 [pool-1-thread-3] INFO c.m.c.example.threadPool.test9 - task:9
Process finished with exit code 0
newSingleThreadExecutor
package com.mmall.concurrency.example.threadPool;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@Slf4j
public class ThreadPoolExample3 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
log.info("task:{}", index);
}
});
}
executorService.shutdown();
}
}
// 输出
11:08:19.913 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:0
11:08:19.918 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:1
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:2
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:3
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:4
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:5
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:6
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:7
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:8
11:08:19.919 [pool-1-thread-1] INFO c.m.c.example.threadPool.test9 - task:9
Process finished with exit code 0
newScheduledThreadPool
package com.mmall.concurrency.example.threadPool;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j
public class ThreadPoolExample4 {
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// executorService.schedule(new Runnable() {
// @Override
// public void run() {
// log.warn("schedule run");
// }
// }, 3, TimeUnit.SECONDS);
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.warn("schedule run");
}
}, 1, 3, TimeUnit.SECONDS);
// executorService.shutdown();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
log.warn("timer run");
}
}, new Date(), 5 * 1000);
}
}
// 输出
11:09:04.287 [Timer-0] WARN c.m.c.example.threadPool.test9 - timer run
11:09:05.285 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run
11:09:08.286 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run
11:09:09.286 [Timer-0] WARN c.m.c.example.threadPool.test9 - timer run
11:09:11.284 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run
11:09:14.286 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run
11:09:14.286 [Timer-0] WARN c.m.c.example.threadPool.test9 - timer run
11:09:17.287 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run
11:09:19.287 [Timer-0] WARN c.m.c.example.threadPool.test9 - timer run
11:09:20.286 [pool-1-thread-1] WARN c.m.c.example.threadPool.test9 - schedule run