1.第一种方式Executors 工具类
固定大小线程池:newFixedThreadPool
单一线程池:newSingleThreadExecutor
可变线程池: newCachedThreadPool
调度线程池:newScheduledThreadPool
1.1单一线程池
该线程池只有一个线程,适用于需要按任务执行线程场景,保证任务的顺序性
//创建应该单一线程池 // ExecutorService executorService = Executors.newSingleThreadExecutor(); // executorService.submit(new Runnable() { // @Override // public void run() { // for (int i = 0; i < 10; i++) { // System.out.println(Thread.currentThread().getName()+"+++++++++++++++++"+i); // // } // } // });
1.2固定大小线程池
ExecutorService executorService = Executors.newFixedThreadPool(5); // //创建任务 // for (int i = 0; i < 5; i++) { // executorService.submit(new Runnable() { // @Override // public void run() { // for (int j = 0; j < 5; j++) { // System.out.println(Thread.currentThread().getName() + " 任务执行 " + j); // } // } // }); // }
线程数量固定,任务提交后会一直处于新建状态,直到线程池关闭。适用于需要限制并发请求的场景,服务器后台处理任务,web服务器等。
1.3 可变线程池
//创建一个可以自动改变大小的线程池 // ExecutorService executorService = Executors.newCachedThreadPool(); // for (int i = 0; i < 10; i++) { // executorService.submit(()->{ // System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); // }); // }
特点:可以动态调整大小的线程池,根据任务数量自动增加线程数量。
使用场景:适用于需要大量处理短期任务的线程场景,如异步请求,服务器后台处理任务等。
1.4调度线程池:
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//线程数量 // for (int i = 0; i < 10; i++) { // scheduledExecutorService.schedule(()->{ // System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~"); // },5,TimeUnit.SECONDS);//5表示多长时间后执行任务 单位 // } scheduledExecutorService.scheduleAtFixedRate(()->{ },5,2,TimeUnit.SECONDS);
特点:可以定时或周期性执行任务
使用场景:适用于定时执行或周期性执行的线程场景,如定时数据备份,定时任务调度。
最后还需要关闭线程池,避免资源浪费
//关闭线程池 // executorService.shutdown(); // //保证所有任务都执行完成 // while (!executorService.isTerminated()) { // }
2.第二种方式:ThreadPoolExecutor
//核心参数的意思 /** * int corePoolSize,核心线程数的个数 2 * int maximumPoolSize,最大线程数量 5 * long keepAliveTime, 非核心线程允许空闲的时间 * TimeUnit unit, 时间的单位 * BlockingQueue<Runnable> workQueue 堵塞队列中 3 */
需要先创建一个堵塞队列的对象
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(5);//创建堵塞队列 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 5, 10, TimeUnit.SECONDS, arrayBlockingQueue); for (int i = 0; i < 10; i++) { threadPoolExecutor.submit(()->{ System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~~~~~"); }); }
附加:
execute和submit方法区别
共同点:这两个方法都是用来执行线程任务的。
不同点:execute属于Excute类中的方法,而submit属于ExcutirService接口中的方法,而且submit可以执行Runable和Callable类型的任务,而execute只能执行Runable类型的任务,submit执行完任务有返回结果。
标签:两种,int,创建,submit,++,任务,线程,executorService From: https://blog.csdn.net/wuzhaoyang11/article/details/140285915