没有合适的资源?快使用搜索试试~ 我知道了~
11-线程池ThreadPoolExecutor底层原理源码分析(上)-周瑜.pdf
需积分: 0 2 下载量 31 浏览量
2024-02-28
14:59:57
上传
评论
收藏 304KB PDF 举报
温馨提示
试读
12页
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1).zip
资源推荐
资源详情
资源评论
课程内容:
有道云链接:
课程代码:
ThreadPoolExecutor中提供了两种执行任务的方法:
实际上submit中最终还是调用的execute()方法,只不过会返回一个Future对象,用来获取任务执行结
果:
execute(Runnable command)方法执行时会分为三步:
注意:提交一个Runnable时,不管当前线程池中的线程是否空闲,只要数量小于核心线程数就会创建
新线程。
注意:ThreadPoolExecutor相当于是非公平的,比如队列满了之后提交的Runnable可能会比正在
排队的Runnable先执行。
线程池的核心线程数、最大线程数该如何设置
线程池执行任务的具体流程是怎样的?
线程池的五种状态是如何流转的?
线程池中的线程是如何关闭的?
线程池为什么一定得是阻塞队列?
线程发生异常,会被移出线程池吗?
Tomcat是如何自定义线程池的?
https://note.youdao.com/s/J6OZk2d6
24.09KB
ThreadPoolExec…
.zip
线程池执行任务的具体流程是怎样的?
void execute(Runnable command)
Future<?> submit(Runnable task)
public Future<?> submit(Runnable task) {1
if (task == null) throw new NullPointerException();2
RunnableFuture<Void> ftask = newTaskFor(task, null);3
execute(ftask);4
return ftask;5
}6
1.
2.
线程池有五种状态:
这五种状态并不能任意转换,只会有以下几种转换情况:
我们一般会使用thread.start()方法来开启一个线程,那如何停掉一个线程呢?
Thread类提供了一个stop(),但是标记了@Deprecated,为什么不推荐用stop()方法来停掉线程呢?
因为stop()方法太粗暴了,一旦调用了stop(),就会直接停掉线程,但是调用的时候根本不知道线程刚
刚在做什么,任务做到哪一步了,这是很危险的。
这里强调一点,stop()会释放线程占用的synchronized锁(不会自动释放ReentrantLock锁,这也是
不建议用stop()的一个因素)。
线程池的五种状态是如何流转的?
RUNNING:会接收新任务并且会处理队列中的任务
SHUTDOWN:不会接收新任务并且会处理队列中的任务
STOP:不会接收新任务并且不会处理队列中的任务,并且会中断在处理的任务(注意:一个任务能不能被中断
得看任务本身)
TIDYING:所有任务都终止了,线程池中也没有线程了,这样线程池的状态就会转为TIDYING,一旦达到此状
态,就会调用线程池的terminated()
TERMINATED:terminated()执行完之后就会转变为TERMINATED
RUNNING -> SHUTDOWN:手动调用shutdown()触发,或者线程池对象GC时会调用finalize()从而调用
shutdown()
(RUNNING or SHUTDOWN) -> STOP:调用shutdownNow()触发,如果先调shutdown()紧着调
shutdownNow(),就会发生SHUTDOWN -> STOP
SHUTDOWN -> TIDYING:队列为空并且线程池中没有线程时自动转换
STOP -> TIDYING:线程池中没有线程时自动转换(队列中可能还有任务)
TIDYING -> TERMINATED:terminated()执行完后就会自动转换
线程池中的线程是如何关闭的?
package com.zhouyu;1
2
import java.util.concurrent.locks.ReentrantLock;3
4
1.
2.
3.
4.
5.
/**5
* 作者:周瑜大都督6
*/7
public class ThreadTest {8
9
static int count = 0;10
static final Object lock = new Object();11
static final ReentrantLock reentrantLock = new ReentrantLock();12
13
public static void main(String[] args) throws InterruptedException {14
15
Thread thread = new Thread(new Runnable() {16
public void run() {17
// synchronized (lock) {18
reentrantLock.lock();19
for (int i = 0; i < 100; i++) {20
count++;21
try {22
Thread.sleep(1000);23
} catch (InterruptedException e) {24
throw new RuntimeException(e);25
}26
}27
// }28
reentrantLock.unlock();29
}30
});31
32
thread.start();33
34
Thread.sleep(5*1000);35
36
thread.stop();37
//38
// Thread.sleep(5*1000);39
40
reentrantLock.lock();41
System.out.println(count);42
reentrantLock.unlock();43
44
剩余11页未读,继续阅读
资源评论
代码匠心印记
- 粉丝: 483
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功