说明:先上代码,笔记后续补充。
public class ExecutorTest1 {
//Executor 线程池
//Executor是一个接口 只能执行任务,没有关闭的方法
/**
* ExecutorService是Exector的子类(也是个接口) 提供了关闭的方法
* void shutdown();比较柔性的关闭,停止接收新任务,如果还有线程在执行,会等待线程执行结束在关闭
* List<Runnable> shutdownNow(); 强制关闭 返回值就是直接被干掉的线程
* boolean isShutdown(); 判断是否已经关闭,调用了shutdowm就会处于shutdown状态
* boolean isTerminated(); 判断是否终止状态 所有线程执行结束
*
*
* public ThreadPoolExecutor的参数
* int corePoolSize, 核心线程数
* int maximumPoolSize, 最大线程数
* long keepAliveTime, 线程存活时间
* TimeUnit unit, 时间单位↑
* BlockingQueue<Runnable> workQueue 工作队列,Runnable类型的参数是任务
* RejectedExecutionHandler 除了异常之后的处理方式
*
*/
static ExecutorService executor = Executors.newCachedThreadPool();
public static void main(String[] args) throws IOException {
//能容纳100个线程的线程池
// Executor executor = Executors.newFixedThreadPool(100);
//单一线程的线程池,池中只有一个线程,如果被占用则等待,如果这个线程有问题或者挂了,则会出现一个新的线程
// Executor executor = Executors.newSingleThreadExecutor();
//缓冲线程池,池中线程数量不确定,无上限(有风险)
//Executor executor = Executors.newCachedThreadPool();
//可调度的线程池------定时任务
// Executors.newScheduledThreadPool()
ServerSocket serverSocket = new ServerSocket(80);
while (!executor.isShutdown()){
Socket socket = serverSocket.accept();
try {
//这里可以使用lambda表达式来替换,new Thread(()-> handleRequest(socket))
executor.execute(new Runnable() {
@Override
public void run() {
handleRequest(socket);
}
});
} catch (RejectedExecutionException e) {
//如果这里线程池是关闭处于关闭状态那么没毛病,如果不是关闭状态,那么就是线程池出现了问题
if (!executor.isShutdown()){
System.out.println("线程池接收任务失败。。。");
throw e;
}
}
}
}
public void stop(){
executor.shutdown();
}
public static void handleRequest(Socket socket) {
System.out.println("访问成功");
}
}