2、默认实现
package com.lizba.p3.threadpool;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
-
-
线程池默认实现
-
@Author: Liziba
-
@Date: 2021/6/17 22:34
*/
public class DefaultThreadPool implements ThreadPool {
/** 线程池最大工作者线程数量 */
private static final int MAX_WORKER_SIZE = 20;
/** 线程池默认工作者线程数量 */
private static final int DEFAULT_WORKER_SIZE = 5;
/** 线程池最小工作者线程数量 */
private static final int MIN_WORKER_SIZE = 5;
/** 工作队列,也称任务队列,用来存放客户端提交的任务 */
private final LinkedList jobs = new LinkedList<>();
/** 工作者列表,需要具有同步性质,支持并发操作 */
private final List workers = Collections.synchronizedList(new ArrayList());
/** 工作线程的数量 */
private int workerNum = DEFAULT_WORKER_SIZE;
/** 线程编号生成器 */
private AtomicLong threadNum = new AtomicLong();
public DefaultThreadPool() {
initWorker(DEFAULT_WORKER_SIZE);
}
/**
-
初始化线程工作者,并启动
-
@param size 初始化工作着大小
*/
private void initWorker(int size) {
for (int i = 0; i < size; i++) {
Worker worker = new Worker();
workers.add(worker);
Thread thread = new Thread(worker, “ThreadPool-Worker-” + threadNum.incrementAndGet());
thread.start();
}
}
@Override
public void execute(Job job) {
if (job != null) {
// 添加一个任务,然后通知等待在jobs上的worker
synchronized (jobs) {
jobs.add(job);
jobs.notifyAll();
}
}
}
@Override
public void shutdown() {
workers.forEach(worker -> worker.shutdown());
}
@Override
public void addWorkers(int num) {
// 此处要锁住jobs,因为worker会从jobs获取任务,需要jobs通知等待中的worker
synchronized (jobs) {
// 不允许工作者线程数操作最大值
if (num + this.workerNum > MAX_WORKER_SIZE) {
num = MAX_WORKER_SIZE - this.workerNum;
}
initWorker(num);
this.workerNum += num;
}
}
@Override
public void removeWorkers(int num) {
synchronized (jobs) {
if (num > this.workerNum) {
throw new IllegalArgumentException(“超出工作者数目!”);
}
int count = 0;
while (count < num) {
Worker worker = workers.get(count);
// 如果移除成功则关闭工作者,工作者将不会继续获取任务执行
if (workers.remove(worker)) {
worker.shutdown();
count++;
}
this.workerNum -= count;
}
}
}
@Override
public int getJobSize() {
return jobs.size();
}
/**
-
-
工作者-负责消费客户端提交的任务
-
@Author: Liziba
-
@Date: 2021/6/17 22:41
*/
class Worker implements Runnable {
/** 是否工作 */
private volatile boolean running = Boolean.TRUE;
@Override
public void run() {
while (running) {
Job job = null;
synchronized (jobs) {
while (jobs.isEmpty()) {
try {
jobs.wait();
} catch (InterruptedException e) {
// 如果感应到外部的中断通知,则自己主动中断返回
Thread.currentThread().interrupt();
return;
}
}
// 取出任务队列的第一个任务
job = jobs.removeFirst();
}
// 执行任务
if (job != null) {
try {
job.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
- 关闭worker,全部关闭意味着线程池关闭
*/
public void shutdown() {
running = false;
}
}
}
测试
package com.lizba.p3.threadpool;
import com.lizba.p2.SleepUtil;
/**
-
-
线程池测试
-
@Author: Liziba
-
@Date: 2021/6/17 23:19
*/
public class PoolTest {
public static void main(String[] args) {
DefaultThreadPool pool = new DefaultThreadPool();
// 提交10个任务
int size = 10;
for (int i = 0; i < size; i++) {
Thread job = new Thread(new Runnable() {
@Override
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/b34b24240680c3bfa9630025373b67bd.jpeg)
资源分享
- 最新大厂面试专题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
- 对应导图的Android高级工程师进阶系统学习视频
最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
/H4lCoPEF.jpg" />
资源分享
- 最新大厂面试专题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
[外链图片转存中…(img-8e4jmuK8-1713619485063)]
- 对应导图的Android高级工程师进阶系统学习视频
最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!
[外链图片转存中…(img-Cc0oNVJB-1713619485064)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!