平顶山网站网站建设,网页设计与制作教程 刘瑞信 pdf,h5网站开发培训哪里好,青岛专业制作网站的公司线程池的创建方式#xff1a;
1、newCachedThreadPoo#xff1a; 创建一个可缓存的线程池#xff0c;当线程池的线程数量超过任务数量时#xff0c;自动回收空闲线程#xff0c;当线程当任务数量超过线程池的线程数量时#xff0c;自动添加新线程; ExecutorService exec…线程池的创建方式
1、newCachedThreadPoo 创建一个可缓存的线程池当线程池的线程数量超过任务数量时自动回收空闲线程当线程当任务数量超过线程池的线程数量时自动添加新线程; ExecutorService executor Executors,newCachedThreadPool();
for (int i 0;i 10; i) {//模拟10个任务executor.submit(new Runnable() {Overridepublic void run() {// 线程执行的代码}});
executor.shutdown () ;
2、newFixedThreadPool(int n) 创建一个固定大小的线程池线程数量固定为n当任务数量超过线程池的线程数量时任务会被放在任务队列中等待执行。 ExecutorService executor Executors.newFixedThreadPool(5);
for (int i 0; i 10; i) {//模拟10个任务executor.submit (new Runnable () {Overridepublic void run() {// 线程执行的代码} });
}
executor.shutdown () ;
3、newSingleThreadExecutorl : 创建一个单线程的线程池所有任务都在同一个线程中顺序执行。 ExecutorService executor Executors.newSingleThreadExecutor();
for (int i 0; 10; i) {
//模拟10个任务
executor.submit (new Runnable(){
Override
public void run() {// 线程执行的代码}});
}
executor.shutdown ();4、newScheduledThreadPool(int corePoolSize)
ScheduledExecutorService executor Executors.newScheduledThreadPoo1(2);
for (int i 0;i 10; i) {
//模拟10个任务
executor.schedule(new Runnable () {Overridepublic void run{// 线程执行代码} },5,TimeUnit.SECONDS);
}
executor.shutdown () ;建一个定时任务的线程池可以在指定的时间间隔内周期性的执行任务在阿里巴巴这么开发手册中建议开发者手动创建线程。 [强制]线程池不允许使用 Executors 去创建而是通过ThreadPoolExecutor的方式这4样的处理方式让写的同学更加明确线程池的运行规则规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下1)FixedThreadPool和 SinaleThreadPool :
允许的请求队列长度为 Integer.MAX_VALUE可能会堆积大量的请求从而导致 OOM2)CachedThreadPool :
允许的创建线程数量为 Integer.MAX_VALUE可能会创建大量的线程从而导致 OOM。 这是因为Executors工具类虽然提供了一些便利的方法来创建线程池这些方法并没有很好的考虑到线程池的使用场景和实际需求容易导致线程池的滥用。进而引发各种问题 我们可以通过ThreadPoolExecutor手动创建: 自定义设置参数: corePoolSize :线程池的核心线程数即在没有任务需要执行时线程池的大小 maximumPoolSize线程池最大能够容纳的线程数当线程池的工作队列已满并且仍有新的任务到来时线程池就会创建新的线程直到达到该参数指定的上限 keepAliveTime: 当线程池中线程数量超过核心线程数时这时多余的空闲线程在终止之前等待新任务的最长时间 unitkeepAliveTime参数的时间单位 workQueue任务队列用于存放等待执行的任务 threadFactory线程工厂用于创建新线程的工厂 handler拒绝策略当线程池无法处理新任务时的处理方式 ExecutorService threadPool new ThreadPoolExecutor(2,// 核心线程数10,// 最大线程数2L,//空闲线程存活时间TimeUnit.SECONDS,// 空闲线程活跃时间单位new LinkedBlockingQueueRunnable(5),// 线程池任务队列Executors.defaultThreadFactory()// 默认线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略);try {for (int i 0; 10; i) { // 模拟10个用户来办理业务threadPool.execute(() -{// 线程要执行的任务; });}} catch (Exception e) {e.printstackTrace() ;} finally {threadPool.shutdown(); // 关闭线程池}