这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战
并发
- 在
java
中实现一个并发的方式有很多- 比如实现一个
Runable
接口
- 比如实现一个
public class testRunable implements Runnable{
@Override
public void run() {
System.out.println("test");
}
}
复制代码
run
方法的代码是在一个线程汇总执行,- 线程的执行主要是一些利的指令,而有操作系统来提供
- 我们根本没有必要一个一个任务一个线程,这样也造成了很大的资源浪费
- 如果我们使用线程池,如下图
- 当我们使用线程池的时候,
newCachedThreadPool
会产生一个很多短暂的任务- 这样每个任务会在空闲的线程上执行
线程的创建创建
- 本身在
Java
中创建线程有三种方式- 继承
Thread
类 - 实现
Runable
接口 - 使用
FutureTask
- 继承
1.Thread
- 用类对象去调用
start()
启动此线程- 启动的过程是先获取到
CPU
资源,然后真正变更到运行状态
- 启动的过程是先获取到
2.Runable
- 没有任务就返回
3.FutureTask
- 代码实现
call
方法FutureTask
对象的get()
方法是等待任务执行完毕并返回结果
线程池
- 线程池的诞生有种种原因
- 首先我们去思考单线程的
Executor
,如果一个任务将另一个任务提交到同一个Executor
- 但是会发生一直等待第一个任务的提交结果,所以这样会经常引发死锁
- 首先我们去思考单线程的
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
复制代码
- 线程池的核心基本大小、最大线程数和存活时间都是来共同负责线程的创建和销毁的
- 工作队列满了的时候就会创建超出这个数量的线程
- 但是如果有的线程超过了存活时间那么肯定会被收回的