没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
73页
为什么要用线程池? Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。 假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超
资源推荐
资源详情
资源评论
1、 课程介绍
2、 线程回顾
2.1、 实现多线程的三种方式
2.1.1、
实现
Runnable
接口
2.1.2、
实现
Callable
接口
2.1.3、
继承
Thread
类
2.1.4、
面试题
2.2、 线程操作&生命周期
2.2.1、
线程的方法
2.2.2
、线程的状态
2.2.3
、线程通信
3、 锁的认识和使用
3.1、 线程安全概述
3.2、 线程安全的实现方法
3.2.1、
悲观锁
3.2.2、
乐观锁
3.2.3、 扩展:Java 中的锁
3.3、 线程安全-线程同步 synchronized
3.3.1、 synchronized
的用法
3.3.2、 synchronized
的作用
3.3.3、 synchronized
原理
3.3.3.1、 monitorenter-
加锁
3.3.3.2、 monitorexit-
释放
3.3.4、 扩展:Java 虚拟机对 synchronized 的优化
3.4、
线程并发库组成
(lock/atomic)
3.4.1、
显式锁
3.4.2、
原子变量类
java.util.concurrent.atomic
(乐观锁)
3.4.3、
线程池相关
3.4.4、
并发容器类
3.4.5
、同步工具类
3.5
、
synchronized
与
Lock
的区别
3.6、线程安全-乐观锁
3.6.1
、
AtomicInteger
案例
3.6.2
、使用场景
4、 ThreadLocal
4.1、 ThreadLocal
的认识
4.2、 ThreadLocal
的原理
4.3、 内存泄露问题
4.4
、使用场景
4.4.1
、存储用户
Session
4.4.2、解决线程安全的问题
4.5
、
ThreadLocalRandom
5、 线程池
5.1、 为什么使用线程池
5.2、 认识线程池
5.2.1
、线程池继承体系
5.3、线程池原理(重点)
5.3.1
、执行流程
5.3.2
、线程池核心构造器
5.4、常见四种线程池
5.4.1
、
CachedThreadPool
5.4.2
、
FixedThreadPool
5.4.3
、
SingleThreadPool
5.4.4
、
ScheduledThreadPool
5.4.5
、自定义
ThreadPoolExecutor
5.5、在 ThreadPoolExecutor 类中几个重要的方法
5.6、如何设置 大线程数
5.6.1
、
CPU
密集型
5.6.2、IO 密集型
5.6.3
、分析
5.6.4
、总结
6、 Demo 分析
6.1、
线程回顾
6.2、
多线程
6.3、
线程池
6.4、 线程池创建方式对比
6.5
、报错分析
6.6、自定义线程池
7、 案例实战
7.1
、准备工作
7.1.1
、数据库表准备
7.1.2、生成 Excel 工具类
7.1.3、读取 Excel 工具类
7.2
、方式一:单线程读取
Excel
7.3
、方式二:线程池读取
Excel
7.4
、总结
1、课程介绍
1. 线程回顾(掌握)
2. 各种所的认识(了解)
3. JUC
并发库(了解)
4. ThreadLocal
(掌握)
5. 线程池(掌握)
2、线程回顾
进程:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系
统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的
时
候就会为它分配 CPU 时间,程序开始真正运行。
线程:线程是程序执行时的 小单位,它是进程的一个执行流,是 CPU 调度和分派的基本单位,一
个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变
量。线程由 CPU 独立调度执行,在多 CPU 环境下就允许多个线程同时运行。同样多线程也可以
实现并发
操作,每个请求分配一个线程来处理。
进程是资源分配的 小单位,线程是程序执行的 小单位。
2.1、实现多线程的三种方式
(1)
继承
Thread
类
(2)
实现
Runnable
接口
(3) 使用 ExecutorService、Callable、Future 实现有返回结果的多线程
实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务,不是真正意义上的线
程,
因此 后还需要通过 Thread 来调用。可以说任务是通过线程驱动从而执行的。
(4) 线程池
2.1.1
、实现
Runnable
接口
需要实现 run()
方法。
通过 Thread 调用 start() 方法来启动线程。
2.1.2
、实现
Callable
接口
与 Runnable 相比,Callable 可以有返回值,返回值通
过 FutureTask 进行封装
2.1.3
、继承
Thread
类
同样也是需要实现 run() 方法,并且 后也是调用 start() 方法
来启动线程
2.1.4
、面试题
问:Thread
和
Runnable
的区别
答:Thread 和 Runnable 的实质是继承关系,没有可比性。无论使用 Runnable 还是 Thread,都会
new
Thread,然后执行 run 方法。用法上,如果有复杂的线程操作需求,那就选择继承 Thread,如果只
是简单的执行一个任务,那就实现 runnable
。
有网友说有这样的区别:Runnable 更容易实现资源共享,能多个线程同时处理一个资源,而 Thread
不
可以。
真的是这样吗?我们来看下面例子:
第一种方式:继承
public
class
ThreadTest
{
public
static
void
main
(
String
[]
args
)
{
new
MyThread
().
start
()
;
new
MyThread
().
start
;
()
}
static
class
MyThread
extends
Thread
{
private
int
ticket
=
5
;
public
void
run
(){
while
(
true
){
System
.
out
.
println
(
"Thread ticket = "
+
ticket
--
)
;
if
(
ticket
<
0
){
break
;
}
}
}
}
}
剩余72页未读,继续阅读
资源评论
H_Jason_
- 粉丝: 341
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功