1. class MyTask implements Runnable {
  2. int i = 0;
  3. public MyTask(int i) {
  4. this.i = i;
  5. }
  6. @Override
  7. public void run() {
  8. System.out.println(Thread.currentThread().getName() + "程序员做第" + i + "个项目");
  9. try {
  10. Thread.sleep(3000L);//业务逻辑
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. }
  1. //corePoolSize:核心线程
  2. //maximumPoolSize:线程池中最多的线程数
  3. //keepAliveTime:表示空闲线程的存活时间(非核心线程)
  4. //unit:keepAliveTime的单位
  5. //workQueue:任务队列
  6. public ThreadPoolExecutor(int corePoolSize,
  7. int maximumPoolSize,
  8. long keepAliveTime,
  9. TimeUnit unit,
  10. BlockingQueue<Runnable> workQueue) {
  11. this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
  12. Executors.defaultThreadFactory(), defaultHandler);
  13. }

newCachedThreadPool

  1. ExecutorService executorService1 = Executors.newCachedThreadPool();
  2. for (int i = 1; i <= 100; i++) {
  3. executorService1.execute(new MyTask(i));
  4. }

截屏2022-04-11 00.10.58.png

  1. //corePoolSize=0,线程池最大数量是int的maxVal
  2. //所以在创建任务的时候,会每个任务都创建一个线程去执行
  3. //这里的任务队列是SynchronousQueue,SynchronousQueue不存储元素
  4. //SynchronousQueue插入的每个任务必须等到另一个线程调用才会移除
  5. public static ExecutorService newCachedThreadPool() {
  6. return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
  7. 60L, TimeUnit.SECONDS,
  8. new SynchronousQueue<Runnable>());
  9. }

newFixedThreadPool

  1. ExecutorService executorService2 = Executors.newFixedThreadPool(10);
  2. for (int i = 1; i <= 100; i++) {
  3. executorService2.execute(new MyTask(i));
  4. }

截屏2022-04-11 00.30.51.png

  1. //这里的核心线程数和最大线程数都是一样的,都是我们的传参10。
  2. //也就是同时最多有10个线程去执行任务,超过10个的时候,把任务放在工作队列里面
  3. //这里的工作队列是LinkedBlockingQueue无界队列
  4. public static ExecutorService newFixedThreadPool(int nThreads) {
  5. return new ThreadPoolExecutor(nThreads, nThreads,
  6. 0L, TimeUnit.MILLISECONDS,
  7. new LinkedBlockingQueue<Runnable>());
  8. }

newSingleThreadExecutor

  1. ExecutorService executorService3 = Executors.newSingleThreadExecutor();
  2. for (int i = 1; i <= 100; i++) {
  3. executorService3.execute(new MyTask(i));
  4. }

截屏2022-04-11 00.47.14.png

  1. //这里的核心线程数和最大线程数都是1
  2. //也就是说同时只能有一个线程在执行
  3. //超过1个任务都会放在队列LinkedBlockingQueue里面
  4. public static ExecutorService newSingleThreadExecutor() {
  5. return new FinalizableDelegatedExecutorService
  6. (new ThreadPoolExecutor(1, 1,
  7. 0L, TimeUnit.MILLISECONDS,
  8. new LinkedBlockingQueue<Runnable>()));
  9. }

自定义线程池

  1. //设置了核心线程数是10,最大线程数20
  2. //在执行下面代码的时候,会在第31个任务出现异常
  3. //因为最多可执行的线数是20,队列最多存放的任务是10个,所以在超过30个任务的时候会出错(拒绝策略)
  4. ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 20,
  5. 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(10));//自定义线程
  6. for (int i = 1; i <= 100; i++) {
  7. threadPoolExecutor.execute(new MyTask(i));
  8. }

截屏2022-04-11 00.58.11.png