当前位置:文档之家› Java多线程与线程池

Java多线程与线程池


重试添加当前的任务,他会自动重复调用execute()方法
• ThreadPoolExecutor.DiscardOldestPolicy()
抛弃旧的任务
• ThreadPoolExecutor.DiscardPolicy()
抛弃当前的任务
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• handler有四个选择:
• ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常 • ThreadPoolExecutor.CallerRunsPolicy()
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• 处理任务的优先级为: • 核心线程corePoolSize、任务队列workQueue、最大 线程maximumPoolSize,如果三者都满了,使用 handler处理被拒绝的任务。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• 一个任务通过 execute(Runnable)方法被添加到线程 池,任务就是一个 Runnable类型的对象,任务的执行 方法就是 Runnable类型对象的run()方法。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• 线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
Executors
• Executors有几个static方法,列出如下:
newCachedThreadPool newFixedThreadPool newSingleThreadExecutor newScheduledThreadPool newSingleThreadScheduledE xecutor 建立可以快取的Thread,每个Thread预设可 idle 60秒 包括固定数量的Thread 只有一个Thread,循序的执行指定给它的每 个任务 可排程的Thread 单一可排程的Thread

SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Blocking Queue
• BlockingQueue的主要方法如下:
add remove element offer poll peek put take 加入元素,如果队列是满的,则抛出IllegalStateException 返回并从队列移除元素,如果队列是空的,则抛出 NoSuchElementException 返回元素,如果队列是空的,则抛出 NoSuchElementException 加入元素并返回true,如果队列是满的,则返回false 返回并从队列移除元素,如果队列是空的,则返回null 返回元素,如果队列是空的,则返回null 加入元素,如果队列是满,就block 返回并移除元素,如果队列是空的,就block
signalAll()
• 通知目前等待中的所有执行线程,而后从上次的等待点继续执行 法。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Lock 与 Condition
• 参见例子Clerk.java
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
SCWCD++企业级开发课程 Java多线程与 线程池
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
目录
• Lock 与 Condition • BlockingQueue • Executors • 线程池ThreadPoolExecutor
线程池ThreadPoolExecutor
• 参见线程池例子:TestThreadPool
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
课堂练习
• 1.线程池案例练习,表迁移实现 已知表A和表A_HIS结构如下: FileName DateType Null commnets id int not null id,自增(注:A_HIS表该字段不为自增) name varchar2(60) not null 名称 type varchar2(60) not null 类型 source varchar2(60) not null 来源 create_name varchar2(60) not null 创建人姓名 desc varchar2(100) not null 描述 create_date varchar2(60) not null 创建时间(yyyy-mm-dd hh:mm:ss) month int not null 月份 • • • 2.先在表A中插入500-1000条记录 3.实现一个工作线程定时每秒插入10条进入到表A 4.实现一个线程池,定时启动一定数量的工作线程迁移表A记录到表A_HIS
Blocking Queue
• 队列(Queue)是个先前先出(First In First Out, FIFO)的数 据结构。 在JDK 5.0中新增了Blocking Queue,在多线程的情況下,如果 Blocking Queue的內容为空,而有个线程试图从Queue中取出元 素,则该线程会被Block,直到Queue有元素时才解除Block,反 过來说,如果 Blocking Queue满了,而有个线程试图再把元素插 入Queue中,则该线程会被Block,直到Queue中有元素被取走后 解除Block。
• • • • • •
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的缓冲队列 handler: 线程池对拒绝任务的处理策略
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• 当一个任务通过execute(Runnable)方法欲添加到线 程池时:
• 如果此时线程池中的数量小于corePoolSize,即使线程池中的线 程都处于空闲状态,也要创建新的线程来处理被添加的任务。 • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。 未满,那么任务被放入缓冲队列。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Executors
• 有时候需要建立许多Thread来执行一些小任务,然而 频繁的建立Thread又会产生开销,因为Thread的建立 必须与操作系统交互,如果能建立一个Thread pool来 管理这些小的Thread并加以重复使用,对于系统性能 会是个很好的改善方式。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Executors
• • 参见例子ExecutorDemo.java 例子解析: 例子使用newFixedThreadPool方法建立Thread pool,当中包括五个可以重复使用的Thread,可以指定 Runnable对象给它,程式中会产生十个Runnable对象,由于 Thread pool中只有五个可用的Thread,所以后来建立的五个 Runnable必须等待有空空的Thread才会被执行。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Blocking Queue
• 课堂练习: 实现生产者消费者Blocking Queue版本
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
线程池ThreadPoolExecutor
• unit可选的参数为java.util.concurrent.TimeUnit中 的几个静态属性: • NANOSECONDS、MICROSECONDS、 MILLISECONDS、SECONDS。 • workQueue常用的有: java.util.concurrent.ArrayBlockingQueue或 java.util.concurrent.LinkedBlockingQueue
SPOTO IT人才培训机构 以伙伴关系帮助客户成功,帮助员工成功,帮助合作伙伴成功。
Lock 与 Condition
• 在java.util.concurrent.locks中新增了Lock与Condition,可以明确的在程序中进行 明确的锁与释放锁。 Lock是一个接口,其中定义了lock()、unclock()与newCondition()三种方法:
相关主题