热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

线程池的类型及其应用场景

newFixedThreadPool创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将

newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {// 创建一个可重用固定个数的线程池ExecutorService fixedThreadPool &#61; Executors.newFixedThreadPool(3);for (int i &#61; 0; i < 10; i&#43;&#43;) {fixedThreadPool.execute(new Runnable() {&#64;Overridepublic void run() {try {// 打印正在执行的缓存线程信息System.out.println(Thread.currentThread().getName()&#43; "正在被执行");Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

因为线程池大小为3&#xff0c;每个任务输出打印结果后sleep 2秒&#xff0c;所以每两秒打印3个结果。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()


newCachedThreadPool

创建一个可缓存的线程池。这种类型的线程池特点是&#xff1a;


工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。



如果长时间没有往线程池中提交任务&#xff0c;即如果工作线程空闲了指定的时间(默认为1分钟)&#xff0c;则该工作线程将自动终止。终止后&#xff0c;如果你又提交了新的任务&#xff0c;则线程池重新创建一个工作线程。


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {// 创建一个可缓存线程池ExecutorService cachedThreadPool &#61; Executors.newCachedThreadPool();for (int i &#61; 0; i < 10; i&#43;&#43;) {try {// sleep可明显看到使用的是线程池里面以前的线程&#xff0c;没有创建新的线程Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}cachedThreadPool.execute(new Runnable() {&#64;Overridepublic void run() {// 打印正在执行的缓存线程信息System.out.println(Thread.currentThread().getName()&#43; "正在被执行");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

线程池为无限大&#xff0c;当执行当前任务时上一个任务已经完成&#xff0c;会复用执行上一个任务的线程&#xff0c;而不用每次新建线程


newSingleThreadExecutor

创建一个单线程化的Executor&#xff0c;即只创建唯一的工作者线程来执行任务&#xff0c;如果这个线程异常结束&#xff0c;会有另一个取代它&#xff0c;保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务&#xff0c;并且在任意给定的时间不会有多个线程是活动的 。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {//创建一个单线程化的线程池ExecutorService singleThreadExecutor &#61; Executors.newSingleThreadExecutor();for (int i &#61; 0; i < 10; i&#43;&#43;) {final int index &#61; i;singleThreadExecutor.execute(new Runnable() {&#64;Overridepublic void run() {try {//结果依次输出&#xff0c;相当于顺序执行各个任务System.out.println(Thread.currentThread().getName()&#43;"正在被执行,打印的值是:"&#43;index);Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}});}}
}

newScheduledThreadPool

创建一个定长的线程池&#xff0c;而且支持定时的以及周期性的任务执行&#xff0c;类似于Timer。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class demo01 {public static void main(String[] args) {//创建一个定长线程池&#xff0c;支持定时及周期性任务执行——延迟执行ScheduledExecutorService scheduledThreadPool &#61; Executors.newScheduledThreadPool(5);//延迟1秒执行/*scheduledThreadPool.schedule(new Runnable() {public void run() {System.out.println("延迟1秒执行");}}, 1, TimeUnit.SECONDS);*///延迟1秒后每3秒执行一次scheduledThreadPool.scheduleAtFixedRate(new Runnable() {&#64;Overridepublic void run() {System.out.println("延迟1秒后每3秒执行一次");}}, 1, 3, TimeUnit.SECONDS);}
}

推荐阅读
author-avatar
XC一米_623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有