1.创建线程,销毁线程是十分消耗资源的,所以不妨为其创建一个“池子”,专门的存放这些线程,使用完毕之后也不销毁,而是保留在那边,等待下一次的使用;为了很好的管理线程;

2.jdk自带的线程池:

a.newCachedThreadPool:创建一个可缓存的线程池,来一个任务就创建一个线程;但是执行完成之后这些线程会被回收回来,长时间无任务,这些线程会被销毁;被回收的线程一旦有新的任务出现,会优先使用这些线程;

b.newFixedThreadPool:创建一个定长的线程池,可以控制线程的最大并发数,超出最大并发数的线程会在队列中等待;

c.newScheduleThreadPool:创建一个定长的线程池,可用于定时或周期的执行任务;

d.newSingleThreadExecutor:创建一个单线程的线程池,这个线程池可以保证任务的顺序执行;并且可以保证不创建线程,所以不会消耗资源;线程池不用我们自己创建线程,而是自动帮助我们完成线程的创建; alt

3.使用线程池,线程;使用创建的线程池对象,并且执行方法;想线程池中的线程提交想要执行的任务:submit方法中可以传入一个runnanle对象,也可以传入一个callable对象,区别在前者没有返回值,后者存在返回值;


import com.ydlclass.lock.ThreadUtil;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class newCachedThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        //创建一个fixedThreadPool线程池;
        ExecutorService executorService1 = Executors.newCachedThreadPool();

        //定义一个runnable类的对象,用于接下来向线程池中提交任务;
        Runnable task = () -> {
            ThreadUtil.sleep(2000);
            System.out.println("---------");
        };
        //向线程池中提交一次任务使用的方法:

        executorService.submit(task);

        //多次提交任务
        for (int i = 0; i < 50; i++) {
            //executorService.submit(task);//由于使用的是newFixedThreadPool线程池,所以一次执行的线程数的个数是固定的;
            executorService1.submit(task);//使用这种方法的线程池会一次性的创建50个线程用于执行任务;而不需要排队等待;
            

        }
    }
}