多线程编程基础(二)
2020/2/23 23:02:52
本文主要是介绍多线程编程基础(二),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
![](/upload/202002/23/202002232302525344.png)
前言
在多线程编程基础(一)中,讲到了线程最基本的使用方法。但是在阿里的开发规范上,这是不值得推荐的。可以在idea中下一个Alibaba Java Coding Guidelines
,来纠正我们开发时的习惯。
![插件的使用效果](/upload/202002/23/202002232302526125.png)
思考
- 如何使用多线程?
- 如此使用多线程开发的好处是什么?
线程池
就上面的第一个问题,我们引入的是一个线程池的概念。想来之前在享元模式中,我们就提及过缓冲池的概念,那么线程池是什么样的呢?
![线程池执行模型](/upload/202002/23/202002232302526838.png)
从图中我们可以获得信息有
- 任务队列:workQueue
- 核心线程数:coolPoolSize
- 最大线程数:maximumPoolSize
- 饱和策略:RejectedExecutionHandler
当然,其实需要的参数还有很多。
// ThreadPoolExecutor的构造函数 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 复制代码
线程池分为很多种类,最常用的是这四种:FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool。
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } 复制代码
从填入的函数可以看出最大线程数和核心线程数的数量相同,也就意味着只有核心线程了,多出的任务,将会被放置到LinkedBlockingQueue
中。
CachedThreadPool
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 复制代码
没有核心线程,最大线程数为无穷,也就意味着全部都是非核心线程。这样的线程池更适合去完成大量需要立即处理,但是耗时短的任务。
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } 复制代码
核心线程数和最大线程数相同,且都为1,也就意味着任务是按序工作的。
ScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) { return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); } public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue(), threadFactory); } 复制代码
从函数名就已经说明了,是一种定时任务。其实就我的思考,他可以用于实现各种各样功能类似的其他线程池。因为DelayedWorkQueue
队列中你可以插入一个立刻需要执行的任务。
使用线程池的好处
- 线程的复用
每次使用线程我们是不是需要去创建一个
Thread
,然后start()
,然后就等结果,最后的销毁就等着垃圾回收机制来了。 但是问题是如果有1000个任务呢,你要创建1000个Thread吗?如果创建了,那回收又要花多久的时间?
- 控制线程的并发数
存在核心线程和非核心线程,还有任务队列,那么就可以保证资源的争夺是处于一个尽量可控的状态的。
- 线程的管理
以上就是我的学习成果,如果有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。
相关文章推荐: 多线程编程基础(一)
这篇关于多线程编程基础(二)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-18android.permission.read_media_video
- 2024-01-18android_getaddrinfo failed eai_nodata
- 2024-01-18androidmo
- 2024-01-15Android下三种离屏渲染技术
- 2024-01-09Android 蓝牙使用
- 2024-01-06Android对接华为AI - 文本识别
- 2023-11-15代码安全之代码混淆及加固(Android)
- 2023-11-10简述Android语音播报TTS
- 2023-11-06Android WiFi工具类
- 2023-07-22Android开发未来的出路