《JavaEE》第八周day1学习笔记-线程池

一、线程池

线程的创建和销毁需要消耗资源,如果单一线程仅处理一项任务(Runnable),缺乏“经济性”。为提高线程利用率,提高响应速度,提高管理性,需要通过线程池对线程进行科学管理。

(一)线程池相关的类


java.util.concurrent.Executor:线程池顶层接口
java.util.concurrent.Executors:线程池工厂类
java.util.concurrent.ExecutorService:线程池标准接口,继承自Executor

(二)Executors创建线程池


newFixedThreadPool(int):创建定长线程池
newCachedThreadPool():创建不定长线程池
newSingleThreadPoolExecutor():创建单一线程池
newScheduledThreadPool(int):创建定长定时线程池

(三)其他内容


1.Callable创建线程
Thread接口及Runnable接口均无返回值,如果需要线程返回执行结果,需要使用Callable、Future类。
Callable只能在ExecutorService中执行。
创建过程:
创建一个类实现Callable<E>接口→重写call()方法并标明返回值类型→‘主线程’→通过Executors.newCachedThreadPool()方法创建线程池→创建实现Callable接口类的实例→执行线程池.submit(实例)方法→接收返回值
2.Future
Callable线程返回的结果可以被Future对象接收,并提供执行状态查询方法。
.get()方法可查询运行结果。
3.ThreadPoolExecutor

//(1)创建对象
public ThreadPoolExecutor(int corePoolSize,//核心线程池大小
int maximumPoolSize,//最大线程池大小 
long keepAliveTime,//线程缓存时间
TimeUnit unit,//缓存时间单位
BlockingQueue<Runnable> workQueue,//缓存队列
ThreadFactory threadFactory,//线程工厂,Executors.defaultThreadFactory()可产生默认工厂
RejectedExecutionHandler handler)//拒绝策略
//(2)缓存队列
ArrayBlockingQueue//数组队列,有界。
LinkedBlockingQueue//链表队列,有界/无界。
PriorityBlockingQueue//优先队列,支持任务排序。
SynchronousQueue//无容量、无缓冲队列,任务唯一。
//(3)拒绝策略
ThreadPoolExecutor.AbortPolicy//丢弃任务,抛出RejectedExecutionException。
ThreadPoolExecutor.DiscardPolicy//丢弃任务,不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy//丢弃队列最前面的旧任务,重新尝试执行新任务,循环过程。
ThreadPoolExecutor.CallerRunsPolicy//交由调用线程处理。
//(4)执行线程
.execute(Runnable)//执行线程。

二、数据库连接池

本质是数据库连接的容器(集合),当容器创建后,会自动生成若干连接提供调用,访问完成后会将连接对象归还给容器(如果连接对象是从连接池获取的,调用Connection.close()方法不再关闭连接)。

(一)C3P0


1.前置条件
(1)工具包:c3p0-0.9.5.5.jar + mchange-commons-java-0.2.19.jar
(2)配置文件:c3p0-config.xml/c3p0.properties
c3p0-config.xml:

<c3p0-config>
    <default-config>

        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/'数据库名称'</property>
        <property name="user">root</property>
        <property name="password">root</property>
		
		<!-- 连接池参数 -->
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">10</property>
		<property name="checkoutTimeout">3000</property>

    </default-config>

    <!-- This app is massive! -->
    <named-config name="intergalactoApp">
        <property name="acquireIncrement">50</property>
        <property name="initialPoolSize">100</property>
        <property name="minPoolSize">50</property>
        <property name="maxPoolSize">1000</property>

        <!-- intergalactoApp adopts a different approach to configuring statement caching -->
        <property name="maxStatements">0</property>
        <property name="maxStatementsPerConnection">5</property>

        <!-- he's important, but there's only one of him -->
        <user-overrides user="master-of-the-universe">
            <property name="acquireIncrement">1</property>
            <property name="initialPoolSize">1</property>
            <property name="minPoolSize">1</property>
            <property name="maxPoolSize">5</property>
            <property name="maxStatementsPerConnection">50</property>
        </user-overrides>
    </named-config>
</c3p0-config>

c3p0.properties:

c3p0.driverClass=com.mysql.cj.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/'数据库名称'
c3p0.user=root
c3p0.password=root

2.创建过程
创建ComboPooledDataSource对象(可调用xml标签named-config名称)→返回DataSource对象→调用.getConnection()方法。

(二)Druid


德鲁伊特,阿里巴巴开发;
1.前置条件
(1)工具包:druid-1.0.9.jar
(2)配置文件:druid.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/'数据库名称'
username=root
password=root123
initialSize=5
maxActive=10
maxWait=3000

2.创建过程
创建DataSource对象→创建Properties属性集→通过反射类加载器获得配置文件→通过属性集.load方法装载→通过DruidDataSourceFactory.createDataSource(属性集)获得DataSource对象→调用.getConnection()方法。

(三)DBCP


数据库连接池:DataBase Connection Pool,Apache开发;
1.前置条件
(1)工具包:commons-dbcp2-2.7.0.jar + commons-logging-1.2.jar + commons-pool2-2.7.0.jar
(2)配置文件:dbcp.properties

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/'数据库名称'
username=root
password=root123
#<!-- 初始化连接 -->
initialSize=20
#<!-- 最大连接数量 -->
maxActive=100
#<!-- 最大空闲连接 -->
maxIdle=20
#<!-- 最小空闲连接 -->
minIdle=5
#<!-- 超时等待时间以毫秒为单位 -->
maxWait=6000
#解决编码问题
connectionProperties=useUnicode=true;characterEncoding=utf8
#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true
#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

2.创建过程
创建DataSource对象→创建Properties属性集→通过反射类加载器获得配置文件→通过属性集.load方法装载→通过BasicDataSourceFactory.createDataSource(属性集)获得DataSource对象→调用.getConnection()方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值