多线程(四)-线程池

目录

 

线程池作用

四种常见的线程池:

核心参数


线程池作用

为了减少创建和销毁线程所需的时间,从而提高效率,管理线程:线程池进行创建及分配。

JDK1.5之后加入了java.util.concurrent包,Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其实也只是ThreadPoolExecutor的构造函数参数不同而已。通过传入不同的参数,就可以构造出适用于不同应用场景下的线程池。

 

四种常见的线程池:

CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。

SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。

SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程,

超出的线程会在队列中等待

 

核心参数

corePoolSize: 核心池的大小。 当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中

maximumPoolSize: 线程池最大线程数,它表示在线程池中最多能创建多少个线程;

keepAliveTime: 表示线程没有任务执行时最多保持多久时间会终止。

unit: 参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性

用户提交线程到核心线程池,如果核心线程池未满执行,已满则放入线程缓存队列,如线程缓存队列满了则放到最大线程池,最大线程池满了则拒绝任务,未满则创建线程任务执行。

package com.www.learn.thread;

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

//线程池
public class ThreadPoolDemo {

	public static void main(String[] args) {
		/*//1.可缓存线程池
		ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
		for(int i=0;i<10;i++) {
			int temp = i;
			newCachedThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName()+" i:" +temp);
				}
			});
		}*/
		
		//2.固定长度线程池
		ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(3);
		for(int i=0;i<10;i++) {
			int temp = i;
			newFixedThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						//异常不会影响
						int j=temp/0;
					} catch (Exception e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName()+" i:" +temp);
				}
			});
		}
		
		/*//3.可定时线程池
		ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(3);
		for(int i=0;i<10;i++) {
			int temp = i;
			newScheduledThreadPool.schedule(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName()+" i:" +temp);
				}
			},3,TimeUnit.SECONDS);
		}*/
		/*
		//4.单线程池
		ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
		for(int i=0;i<10;i++) {
			int temp = i;
			newSingleThreadExecutor.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println(Thread.currentThread().getName()+" i:" +temp);
				}
			});
		}
		newSingleThreadExecutor.shutdown();*/
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值