并发
-
进程和线程
- 进程:资源分配的基本单位。可以理解为在内存中运行的程序。每个进程都有独立的内存空间,一个进程包含多个线程
- 线程:任务执行的基本单位。负责进程中任务的执行。每个线程共享进程的内存空间,一个线程使用时,其他线程必须等待。
- 用户 (User) 线程:
运行在前台,执行具体的任务
,如程序的主线程、连接网络的子线程等都是用户线程。
- 守护 (Daemon) 线程:
运行在后台,为其他前台线程服务
。也可以说守护线程是 JVM 中用户线程的 “佣人”。一旦所有用户线程都结束运行,守护线程会随 JVM 一起结束工作。守护线程拥有自动结束自己生命周期的特性。如垃圾回收线程,程序或JVM退出时,垃圾回收线程能够自动关闭。
-
线程实现方式
-
继承Thread类
- 继承Thread类
- 重写核心执行逻辑run方法
- 调用start方法开启线程。调用run方法只是一个普通方法
-
实现Runnable接口【因为Java是单继承的,所以一般选择Runnable创建线程】
- 实现Runnable接口
- 重写run方法
- 创建Thread对象,构造参数为当前Runnable实现类的对象
- 调用start开启线程
-
实现Callable接口【需要返回值时,选择Callable创建线程】
- 实现Callable接口
- 重写call()方法,有返回值,返回类型就是Callable接口中泛型对应的类型
- 创建FutureTask对象,构造参数为当前Callable接口的实现类对象
- 将FutureTask作为参数创建Thread对象
- 调用start开启线程
- futureTask.get获取call方法返回值
-
线程池
-
为什么使用线程池
- 使用线程池可以复用池中的线程,不需要每次都创建新线程,减少创建和销毁线程的开销;
- 同时,线程池具有队列缓冲策略、拒绝机制,并能动态管理线程个数,特定的线程池还具有定时执行、周期执行功能
-
Executors类创建线程池【不用】
-
FixedThreadPool(固定线程数量)和SingleThreadPool(单例线程池):
允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
-
CachedThreadPool(缓存线程池)和ScheduledThreadPool(定时周期性线程池):
允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
-
ThreadPoolExecutor创建线程池
-
主要参数
-
corePoolSize(int):核心线程数量
-
workQueue:阻塞队列,存放等待执行的任务,使用时指定大小
-
maximumPoolSize(int):线程池内的最大线程数量
-
keepAliveTime(long):线程存活时间
-
TimeUnit unit:线程存活时间的单位
- [RejectedExecutionHandlerxedThreadPool(固定线程数量)和Sigln./xiewenfeng520/article/details/106954167/):拒绝策略,当任务队列存满并且线程池个数达到maximunPoolSize后采取的策略
-
threadFactory:创建线程的工厂
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)