`

Java关于线程池的使用

阅读更多

一、四种线程池创建的方式

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

查看源码发现,在创建这四种线程池都是通过ThreadPoolExecutor来实现的。

 

二、实战

简单不说了,网上都有,页面底部也有推荐的资料。

接下来,直接使用Spring中的线程池来展示,大多的项目中都会用到Spring,所以就可能会使用ThreadPoolTaskExecutor。

1.首先,配置线程池的属性

itom.parseAsyncTaskExecutor.corePoolSize=10
itom.parseAsyncTaskExecutor.maxPoolSize=100
itom.parseAsyncTaskExecutor.queueCapacity=200
itom.parseAsyncTaskExecutor.keepAliveSeconds=300
itom.parseAsyncTaskExecutor.rejectedExecutionHandler=java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy

 

2.applicationContext-itom.xml中配置Bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
	   default-lazy-init="true" default-autowire="byName">

	<!--线程池-->
	<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
		<!--核心线程数,默认为1 -->
		<property name="corePoolSize" value="${itom.parseAsyncTaskExecutor.corePoolSize}" />
		<!--最大线程数,默认为Integer.MAX_VALUE -->
		<property name="maxPoolSize" value="${itom.parseAsyncTaskExecutor.maxPoolSize}" />
		<!--队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE -->
		<property name="queueCapacity" value="${itom.parseAsyncTaskExecutor.queueCapacity}" />
		<!--线程池维护线程所允许的空闲时间,默认为60s -->
		<property name="keepAliveSeconds" value="${itom.parseAsyncTaskExecutor.keepAliveSeconds}" />
		<!--线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者 -->
		<property name="rejectedExecutionHandler">
			<!--AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常 -->
			<!--CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 -->
			<!--DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
			<!--DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 -->
			<bean class="${itom.parseAsyncTaskExecutor.rejectedExecutionHandler}" />
		</property>
	</bean>

</beans>

 

3.在实现的service中直接使用

@Service("itomService")
public class ItomServiceImpl implements ItomService{

    @Autowired
    private LoginService loginService;

    @Autowired
    private ThreadPoolTaskExecutor threadPoolTaskExecutor;

    @Override
    public void calc(final String userId, final String sourceCode) {

        threadPoolTaskExecutor.execute(new Runnable() {
            @Override
            public void run() {
               ...
            }
        });
    }
}

 

4.在类里面直接使用:(根据需要,定制相应的线程池)

private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 10, 60L, 
              TimeUnit.SECONDS,
              new LinkedBlockingQueue<Runnable>(100),
              new ThreadPoolExecutor.AbortPolicy());

 

四种线程池的使用:

http://cuisuqiang.iteye.com/blog/2019372

关于线程池框架写得比较全的:

http://blog.csdn.net/tuke_tuke/article/details/51353925

ThreadPoolExecutor的介绍(属性的信息):

http://blog.xiaohansong.com/2016/07/12/java-executor/

其他:

(Executor、ExecutorService、ThreadPoolExecutor的区别)

http://blog.csdn.net/linghu_java/article/details/17123057

分享到:
评论

相关推荐

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...

    JAVA使用线程池查询大批量数据

    本文将深入探讨如何在Java中使用线程池来查询大量数据,以及这样做的好处和实现方法。 首先,理解线程池的概念至关重要。线程池是一种多线程处理形式,预先创建了若干个线程,当有任务需要执行时,会从线程池中取出...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    java线程池完整代码

    标题 "Java 线程池完整代码" 表明了这篇文章的主题是关于 Java 线程池的完整实现代码,涵盖了线程池的基本概念、配置文件的解析、线程池的创建和管理等方面。 描述解析 描述 "Java 线程池完整源码" 说明了这篇文章...

    Java线程池使用说明

    通过合理使用Java线程池,开发者可以更加高效地管理线程资源,提高应用程序的性能和稳定性。线程池的使用也应当注意避免资源竞争、线程死锁以及可能的内存泄漏等问题,确保线程安全和高效的并行处理能力。

    JAVA经典线程池源码

    Java线程池是Java并发编程中的重要组成部分,它在多线程编程中扮演着至关重要的角色,有效地管理和调度线程资源,提高了程序的性能和稳定性。本资源包含了一个经典的Java线程池实现,适用于大型项目,能帮助开发者...

    一个通用的Java线程池类

    2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...

    java线程池封装j

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...

    java 四种线程池实例

    总之,Java线程池提供了一种强大的工具来管理和优化并发任务的执行,理解并熟练使用各种线程池实例能够显著提升程序的效率和可维护性。在设计系统时,应该充分考虑线程池的选择和配置,以适应不同类型的异步任务需求...

    Java实现通用线程池

    Java 实现通用线程池是指使用 Java 语言编写一个通用的线程池,线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了频繁创建线程的时间,...

    java多线程,对多线程,线程池进行封装,方便使用

    使用`Future`接口可以获取线程执行的结果,`Callable`接口则允许线程返回一个结果,它们与线程池结合使用可以实现异步计算。 8. **线程池的扩展** Java并发包中还有一些其他的Executor实现,如...

    Java版线程池实现

    Java线程池是一种高效管理并发任务执行的机制,它通过预先创建并维护一定数量的线程,从而避免了频繁地创建和销毁线程所带来的性能开销。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    Java concurrency线程池之线程池原理(一)_动力节点Java学院整理

    Java concurrency线程池之线程池原理(一)_动力节点Java学院整理,动力节点口口相传的Java黄埔军校

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    java socket(线程池)

    是一个java在进行socket编程时,关于线程池的介绍,有代码和例子

    自定义实现Java线程池

    ### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...

    java线程池知识.ppt

    java线程池知识、

    java实现通用线程池的代码

    本文旨在使用Java语言编写一个通用的线程池。当需要使用线程池处理事务时,只需按照指定规范封装好事务处理对象,然后用已有的线程池对象去自动选择空 闲线程自动调用事务处理对象即可。并实现线程池的动态修改...

    Java实现的线程池、消息队列功能

    关于“工具”标签,可能是指在实现线程池和消息队列功能时,可能会用到的一些辅助工具或库,比如用于日志记录的Log4j、性能监控的VisualVM,或者是进行代码质量管理的SonarQube等。 文件名“常用的文件操作工具.txt...

    Java/Android线程池演示Demo

    总结,这个"Java/Android线程池演示Demo"旨在通过实例展示如何在Android和Java项目中使用线程池进行并发处理,帮助开发者理解线程池的工作原理和优势,以及如何根据应用需求配置和管理线程池。通过分析和实践这个...

Global site tag (gtag.js) - Google Analytics