new Thread() 弊端
- 每次 new Thread()新建对象,性能差。
- 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机(CPU利用率过高)或OOM。
- 缺少更多功能:更多执行、定期执行、线程中断。
线程池的好处
- 重用存在的线程,减少对象创建、消亡的开销,性能佳
- 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞。
- 提供定时执行、定期执行、单线程、并发数控制等功能
线程池-ThreadPoolExecutor
图片.png图片.png
线程池运行流程
图片.png- 执行shutdown() 后不接受新的任务,但可以继续处理阻塞队列中保存的任务。
- 执行shotdownNow() 不接受新的任务,也不处理阻塞队列中的任务。
常用方法
图片.png图片.png
线程池类图
图片.pngExecutor框架接口
图片.png- newCachedThreadPool
package com.alan.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();
}
}
- newFixedThreadPool
package com.alan.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();
}
}
- newSingleThreadExecutor
package com.alan.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();
}
}
网友评论