线程池

new Thread() 弊端

  • 每次 new Thread()新建对象,性能差。
  • 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机(CPU利用率过高)或OOM。
  • 缺少更多功能:更多执行、定期执行、线程中断。

线程池的好处

  • 重用存在的线程,减少对象创建、消亡的开销,性能佳
  • 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞。
  • 提供定时执行、定期执行、单线程、并发数控制等功能

线程池-ThreadPoolExecutor

图片.png

图片.png

线程池运行流程

图片.png
  • 执行shutdown() 后不接受新的任务,但可以继续处理阻塞队列中保存的任务。
  • 执行shotdownNow() 不接受新的任务,也不处理阻塞队列中的任务。

常用方法

图片.png

图片.png

线程池类图

图片.png

Executor框架接口

图片.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();
    }
}

线程池配置

图片.png

J.U.C整体导图

图片.png

你可能感兴趣的:(线程池)