1.配置自定义共享线程池(Spring线程池)

@Configuration
@EnableAsync
public class ThreadPoolConfig{
 
  //主要任务的调度,计划执行
  @Bean("taskScheduler")
  public Executor createScheduler(){
	    // 创建一个线程池对象
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 定义一个线程池大小
        scheduler.setPoolSize(100);
        // 线程池名的前缀
        scheduler.setThreadNamePrefix("taskScheduler-");
        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
        scheduler.setAwaitTerminationSeconds(60);
        // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
	    return scheduler;
  }

  //主要任务的执行
  @Bean("taskExecutor")
  public Executor createExecutor(){
	    // 创建一个线程池对象
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //核心线程池大小
        executor.setCorePoolSize(10);
        //最大线程数
        executor.setMaxPoolSize(30);
        //队列容量
        executor.setQueueCapacity(100);
        //活跃时间
        executor.setKeepAliveSeconds(60);
        //线程名字前缀
        executor.setThreadNamePrefix("taskExecutor-");
        // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
  }

}

2.编写执行任务对象与具体任务逻辑方法

@Component
public class TaskComponent{
  @Async("taskExecutor")
  public void doTaskExecutor() {
	System.out.println("任务开始执行!!!");
  	//具体的执行任务
	//。。。。。。。
  }

//  //有返回值(ObjectVo为自己定义的返回类型)
//@Async("taskExecutor")
//public Future<ObjectVo> doTaskExecutor() {
//	System.out.println("任务开始执行!!!");
//  	//具体的执行任务
//	//。。。。。。。
//	ObjectVo result=new ObjectVo();
//	return new AsyncResult<>(result);
//}
  @Async("taskScheduler")
  public void doTaskScheduler() {
	System.out.println("任务开始调度!!!");
  	//具体的调度任务
	//。。。。。。。
  }

//  //有返回值(ObjectVo为自己定义的返回类型)
//@Async("taskScheduler")
//public Future<ObjectVo> doTaskScheduler() {
//	System.out.println("任务开始调度!!!");
//  	//具体的调度任务
//	//。。。。。。。
//	ObjectVo result=new ObjectVo();
//	return new AsyncResult<>(result);
//}
}

3.调用任务方法(在哪调用都可以,根据自己业务需求在合适的地方调用即可)

@Service
public class UserServiceImpl implements UserService{
  @Autowired
  private TaskComponent taskComponent;
  //测试任务执行与调用
  @SneakyThrows
  @Override
  public void testTask(){
	//没有返回值
	taskComponent.doTaskExecutor();
	taskComponent.doTaskScheduler();

	//有返回值
	//Future<ObjectVo> executorResult = taskComponent.doTaskExecutor();
	//Future<ObjectVo> schedulerResult = taskComponent.doTaskScheduler();
	//System.out.println(executorResult.get());
	//System.out.println(schedulerResult.get());
  }
}

===============Executors结构========jdk自带线程池==========

1.任务(Runnable,Callable)

2.任务的执行(Executor,ExecutorService 接口,ThreadPoolExecutor,ScheduledThreadExecutor实现类)

3.计算结果(返回结果 Future接口,FutureTask实现类)

===============Executors现成的线程池========jdk自带线程池====

1 Executors.FixedThreadPool 核心数=容纳的最大线程数=N

无界队列(当队列过多时,会造成无限循环)

2 Executors.CachedThreadPool 容纳的最大线程数=无界  

主线程提交任务的速度高于 maximumPoolSize中线程处理任务的速度时 CachedThreadPool将会不断的创建新的线程,

在极端情况下, 

CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源

3 Executors.SingleThreadExecutor 核心数=容纳的最大线程数=1 始终保持只有一个线程在执行 

无界队列(当队列过多时,会造成无限循环)

===============自定义Executors===========jdk自带线程池====================

ExecuteService threadPool = new ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue,
                ThreadFactory threadFactory,
                RejectedExecutionHandler handler);

//设置线程池的前缀

ThreadFactory threadFactory = new ThreadFactoryBuilder()

.setNameFormat("trhead-pool-%d").build();

//设置决绝策略

RejectedExecutionHandler: 

AbortPolicy:抛出RejectedExecutionException

CallerRunsPolicy:直接在execute方法的调用线程中运行被拒绝的任务。

DiscardOldestPolicy:放弃最旧的未处理请求,重试execute。

DiscardPolicy:丢弃被拒绝的任务。

================处理流程===================jdk 与 spring =====================

1.核心线程池是否在执行任务,不在执行就选一条线程执行,否则查看核心线程池是否已满

2.核心线程池是否满,不满则创建一条线程执行,否值查看队列是否已满

3.队列是否满,队列不满加入队列,否则查看线程池是否已满

4.线程池是否已满,线程池不满创建一条线程池,否则根据决绝策略处理

# 1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,是就执行第二步。

# 2.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。

# 3.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。

# 4.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略(拒绝策略)处理无法执行的任务。

到此这篇关于Spring 与 JDK 线程池的简单使用的文章就介绍到这了,更多相关Spring 与 JDK 线程池内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

Spring 与 JDK 线程池的简单使用示例详解的更多相关文章

  1. Butterknife 8.1.0在Android Studio 2.1.2中不能与JDK 1.8一起使用

    如果是,我需要做些什么才能使其正常工作?

  2. android-studio – 安卓工作室更新后的问题

    解决方法我在AndroidStudio中花了很多时间来处理这个问题.看来这个问题是由用于编译项目的java版本的差异引起的.最后,在“项目结构”设置窗口中,我在SDK位置选项卡中启用了“使用嵌入式JDK(推荐)”.并快乐编译:)

  3. Android – 线程池策略和Loader可以用来实现吗?

    )>如果不是什么是创建AsyncTask池的好方法,是否可能正在实施它?

  4. Android Studio在启动时修改./idea/vcs.xml

    因为不建议忽略AndroidStudio中的整个.idea文件夹,所以大多数文件都由git跟踪.然而奇怪的是,每次启动后,即使已经存在数十个,也会向vcs.xml添加相同的行.这很快变老了.这种行为是有目的还是仅仅是一个错误?AndroidStudio还可以在启动时阻止它进行此类修改吗?

  5. Spring JdbcTemplate执行数据库操作详解

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了Spring JdbcTemplate执行数据库操作,需要的朋友可以参考下

  6. Spring Batch批处理框架操作指南

    Spring Batch 是 Spring 提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作,这篇文章主要介绍了Spring Batch批处理框架操作指南,需要的朋友可以参考下

  7. Spring详细讲解@Autowired注解

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入

  8. 使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. Spring Security认证器实现过程详解

    一些权限框架一般都包含认证器和决策器,前者处理登陆验证,后者处理访问资源的控制,这篇文章主要介绍了Spring Security认证器实现过程,需要的朋友可以参考下

  10. spring学习JdbcTemplate数据库事务管理

    这篇文章主要为大家介绍了spring学习JdbcTemplate数据库事务管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部