大纲:
一、常见的创建线程的方式(不介绍线程方法)
1.通过继承extends方式创建
2.通过实现Runnable接口实现
3.通过继承Callable实现
二、用线程池管理线程
一、常见的创建线程的方式
1.通过继承extends方式实现
a.传统方式创建
b.匿名内部类(简化代码)
直接新建Thead,对其run(implements runnable得到)方法进行重写
c.lamda表达式(简化代码plus)
lamda表达式,函数式编程,使代码更加简洁;但是因为是函数式编程,所以具体实现会出现在参数列表中。
2.通过实现Runnable接口实现
a.传统方式
由于Thread实现了Runnable接口,该实现方式就是先实现Runnable,然后再给Thread配置。
个人感觉该方法较为麻烦,多转了一个弯儿
b.其他方式
匿名内部类+lamda表达省略
3.通过继承Callable实现
相对于其他方式,调用call方法时,可以有返回参数(JDK1.5之后支持协变返回类型)
写的比较简略,没有使用call()方法的返回值
二、用线程池管理线程
线程池是提前预留活跃资源的标椎的资源池==>就是将线程进行统一管理,防止无休止创建线程占用资源或使系统崩溃
Java1.8关于线程池官方文档链接:https://docs.oracle.com/javase/8/docs/api/
位置:java.util.concurrent.Executors
a.带有缓存机制的线程池
在执行完提交的一个任务之后 继续保持1分钟60s存活(默认设置)
b.单一线程的线程池
该线程池只维护一个线程,故只有一个线程在运行(除主线程外)
c.可周期执行指定时间的线程池
scheduleAtFixedRate 设置执行周期
schedule 设置线程一共执行的时间
下图代码来自官方文档:
d.可重用的线程池
指定可以预留的活动线程数,但是不会释放线程资源
ExecutorService executors = Executors.newFixedThreadPool(2);(具体实现略)
e.其他大同小异省略
f.ThreadPoolExecutor实现(简要介绍,平时用一次没有问题)
上述线程池大多也是通过ThreadPoolExecutor传递不同参数来实现
所以可以直接使用ThreadPoolExecutor来创建线程池,表义性更强,也更利用理解线程池的实现
ThreadPool各个参数意义:
corePoolSize和maximumPoolSize的区别
总结:
1.大概介绍了创建多线程的方式,用于日常的学习。难免有纰漏和不足,希望能不吝指正。
2.上述代码图片均自测通过,代码量不大,个人感觉图片更简洁一些
3.关于Callable 、自定义线程池写的较为粗略以及关于@Async 异步注解的使用日后会补充