线程池的概念
本质就是一个能够容纳多个线程的容器,其中的线程可以反复利用,省去了频繁创建线程对象的操作,无需因为反复创建线程对象而消耗过多资源
工作线程(PoolWorker)
表示线程池中的线程,在没有任务时处于等待状态,可以循环的执行任务
任务队列(TaskQueue)
用于存放没有处理的任务,提供一种缓冲机制
任务接口(Task)
每个任务必须实现的接口,一共工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等等
线程池管理器(ThreadPool)
用于创建并管理线程。包括:创建线程池,销毁线程池,添加线程或任务等等
线程池创建线程来执行,而Worker执行完之后,就去队列中取未分配的task,调用task的run方法。通俗的讲就是任务来后就分配一个线程使用,线程处于占用状态,如果任务执行完毕,线程归还于线程池,并且暂处于空闲状态
合理利用线程池的好处
降低资源消耗
减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可以执行多个任务
提高响应速度
不需要频繁的创建线程,如果有线程可以直接用,不会出现系统僵死
提高线程的可管理性
线程池可以约束系统最多只能由多少个线程,不会因为线程过多而死机
线程池的核心思想
线程复用,同一个线程可以重复多次被使用,来处理多个任务
代码语言:javascript复制package ThreadPool;
/*
* 创建线程池
* 线程池在Java中的代表类:ExcutorService(接口)
* Java在Executors类下提供一个静态方法得到一个线程池的对象
* public static ExecutorService newFixedThreadPool(int nThreads);
* (创建一个可重用固定线程数的线程池并返回,以共享的无界队列方式来运行这些线程)
* */
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo {
public static void main(String[] args) {
//创建一个线程池,指定线程的固定数量是3
ExecutorService pool= Executors.newFixedThreadPool(3);
//添加线程任务给线程池处理
Runnable task=new MyRunnable();
//可以向线程池提交Runnable接口或Callable接口 ,Callable做线程池的任务可以得到线程执行的结果(返回值类型Future<?>)
pool.submit(task); //第一次向线程池提交任务,此时线程池创建新线程,自动触发执行,不需要再start()
pool.submit(task); //第二次向线程池提交任务,此时线程池创建新线程
pool.submit(task); //第三次向线程池提交任务,此时线程池创建新线程
pool.submit(task); //第四次向线程池提交任务,超出线程池固定数量,此时线程池复用之前的线程
// pool.shutdown(); 在等待任务执行完毕之后关闭线程池
// pool.shutdownNow(); 立即关闭线程池代码,无论任务是否执行完毕
// 线程池开发中一般情况下不关闭
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
for(int i=0;i<5;i ){
System.out.println(Thread.currentThread().getName() "==>" i);
}
}
}