java Executor 提供的五种线程池

五种线程池说明:

Java通过Executors提供五种线程池,都是直接或间接继承自ThreadPoolExcecutor 线程池类,他们都有特殊功能,如果不是必须用这几个特殊的线程池类,也可以直接new ThreadPoolExcecutor() 线程池来干活

这五个特殊的线程池分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时(scheduleWithFixedDelay()函数的initdelay 参数)周期(delay 参数)任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

newSingleThreadScheduledExecutor 创建一个单线程化的支持定时的线程池,可以用一个线程周期性执行任务(比如周期7天,一次任务才用1小时,使用多线程就会浪费资源)


 

代码如下:执行一遍即可看出效果

package ThreadPoolTest;

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

/**
 * 
 * @author jaloli
 * 56 行用 Executors.newFixedThreadPool(3) 创建线程池,其实完全可以用new ThreadPoolExecutor() 创建,因为后者是前者的底层调用
 * 以下四种线程池是继承自ThreadPoolExecutor() 这个根线程池的,
 */
public class ThreadPoolExecutorTest {
	
	/**
	 * newCachedThreadPool
	 * @throws InterruptedException 
	 * @
	 */
	public static void newCachedThreadPoolTest() throws InterruptedException {
		ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
		for(int i=0;i<10;i++) {
			final int index = i;
//			try {
//				Thread.sleep(index * 100);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			} 
			cachedThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println("current Thread name is " + Thread.currentThread().getName() 
							+ " index: " + index);
				}
			});
		}
		Thread.sleep(200);
		//cachedThreadPool.shutdown();//.awaitTermination(10, TimeUnit.SECONDS);  //这个函数功能存疑
		System.out.println("cachedThreadPool isShutdown() is : "+ cachedThreadPool.isShutdown()); //上行不注释,则结果为false,上行不注释,则结果为true
		System.out.println("cachedThreadPool isTerminated() is : "+cachedThreadPool.isTerminated());//上上行注释不注释,结果均为false
		
		cachedThreadPool.execute(new Runnable() {  // cachedThreadPool shutdown 之后,这个execute() 不能之前且会报异常
			@Override
			public void run() { 
				System.out.println("cachedThreadPool is not shutdown and this task can be executing. "
						+ "\n current Thread name is " + Thread.currentThread().getName());
			}
		});
	}
	/**
	 * newFixedThreadPool
	 */
	public static void fixedThreadPoolTest() {
		ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); //这个函数返回的是 ThreadPoolExecutor
		for(int i=0;i<10;i++) {
			final int index = i;
			fixedThreadPool.execute(new Runnable() {
				@Override
				public void run() {
					System.out.println("current Thread name is " + Thread.currentThread().getName() + " index : " + index);
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
		System.out.println("10个任务已分发完毕"); //这句大概率性优先于run 里面的print 语句先执行
	}
	
	/**
	 * 产生一个ScheduledExecutorService对象,
	 * newScheduledThreadPool(3),这个对象的线程池大小为3,若任务数量大于3,
	 * 任务会在一个queue里等待执行
	 * scheduleWithFixedDelay 函数:第一个参数new Runnable 就是任务
	 * 所谓线程池,就是能接受任务。线程池的好处是帮你调度线程,不然还得自己写调度多个线程的方法,比如周期性执行任务
	 */
	public static void scheduledThreadPoolTest() {
		//ScheduledExecutorService 只是个接口,ScheduledThreadPoolExecutor 才是实现此接口的类.ScheduledThreadPoolExecutor 还继承了ThreadPoolExecutor 线程池类
		ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); //这个函数返回的是ScheduledThreadPoolExecutor

//			scheduledThreadPool.schedule(new Runnable() { //schedule 是只执行一次,不是周期性的
//				
//				@Override
//				public void run() {
//					System.out.println("delay 3 seconds index is " + index);
//				}
//			}, 3, TimeUnit.SECONDS);
			System.out.println("---------------------");
			scheduledThreadPool.scheduleWithFixedDelay(new Runnable() { //scheduleWithFixedDelay 是周期性的,
				@Override										//scheduleWithFixedDelay()方法不是ThreadPool 类的是ScheduledExecutorService 接口特有的
				public void run() {
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("current Thread name is " + Thread.currentThread().getName() + " time is : " + new Date().getTime());
				}
			}, 1, 1, TimeUnit.SECONDS);
		}
	
	/**
	 * 单线程线程池,保证所有任务都按照指定顺序(FIFO, LIFO, 优先级)执行
	 * @param args
	 */
	public static void singleThreadExecutorTest() {
		ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
		for(int i = 0;i<10;i++) {
			final int index = i;
			singleThreadExecutor.execute(new Runnable() {
				@Override
				public void run() {
					try {
						System.out.println("current Thread name is " + Thread.currentThread().getName() + " index : " + index);
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
	}
	/**
	 * (5)
	 */
	public static void SingleThreadScheduledExecutorTest() {
		ScheduledExecutorService scheduledThreadPool = Executors.newSingleThreadScheduledExecutor();
			System.out.println("---------------------");
			scheduledThreadPool.scheduleWithFixedDelay(new Runnable() { //scheduleWithFixedDelay 是周期性的
				@Override
				public void run() {
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("current Thread name is " + Thread.currentThread().getName() + " time is : " + new Date().getTime());
				}
			}, 1, 1, TimeUnit.SECONDS); //第二个参数1,虽然是1秒为周期,但是单线程线程池,如果上一个任务没执行完,那么会等2秒或者更多,
		}								//直到上一个任务执行完,才执行下一个任务。即执行完这个条件优先最高,频率次之
	
	
	public static void main(String[] args) throws InterruptedException {
//		newCachedThreadPoolTest();
//		fixedThreadPoolTest();
//		scheduledThreadPoolTest();
//		singleThreadExecutorTest();
		SingleThreadScheduledExecutorTest();
	}
}


 




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用配置类来配置Executor线程池。其中,常用的实现类是`ExecutorService`和`ThreadPoolTaskExecutor`。 首先,需要创建一个配置类,可以命名为`ThreadPoolConfig`或者其他你喜欢的名称。在这个类中,你需要使用`@Configuration`注解来标识它是一个配置类,并且使用`@EnableAsync`注解来启用异步执行。 接下来,你需要定义一个`ExecutorService`或`ThreadPoolTaskExecutor` Bean,并使用`@Bean`注解将其标识为一个Bean。你可以根据项目的需求来选择使用哪个实现类。 如果选择使用`ExecutorService`,可以按照以下方式配置: ```java @Configuration @EnableAsync public class ThreadPoolConfig { @Bean public ExecutorService executorService() { return Executors.newFixedThreadPool(10); // 配置线程池的大小 } } ``` 如果选择使用`ThreadPoolTaskExecutor`,可以按照以下方式配置: ```java @Configuration @EnableAsync public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); // 设置核心线程executor.setMaxPoolSize(20); // 设置最大线程executor.setQueueCapacity(30); // 设置队列容量 executor.setThreadNamePrefix("my-executor-"); // 设置线程名称前缀 executor.initialize(); // 初始化 return executor; } } ``` 在上述配置中,你可以根据实际需求来设置线程池的大小、队列容量等参数。通过这种方式,你就可以在应用程序中注入`ExecutorService`或`ThreadPoolTaskExecutor`,并使用它来执行异步任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值