1.创建线程,销毁线程是十分消耗资源的,所以不妨为其创建一个“池子”,专门的存放这些线程,使用完毕之后也不销毁,而是保留在那边,等待下一次的使用;为了很好的管理线程;
2.jdk自带的线程池:
a.newCachedThreadPool:创建一个可缓存的线程池,来一个任务就创建一个线程;但是执行完成之后这些线程会被回收回来,长时间无任务,这些线程会被销毁;被回收的线程一旦有新的任务出现,会优先使用这些线程;
b.newFixedThreadPool:创建一个定长的线程池,可以控制线程的最大并发数,超出最大并发数的线程会在队列中等待;
c.newScheduleThreadPool:创建一个定长的线程池,可用于定时或周期的执行任务;
d.newSingleThreadExecutor:创建一个单线程的线程池,这个线程池可以保证任务的顺序执行;并且可以保证不创建线程,所以不会消耗资源;线程池不用我们自己创建线程,而是自动帮助我们完成线程的创建;
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个线程用于执行任务;而不需要排队等待;
}
}
}