创建线程的几种方式

大纲:

一、常见的创建线程的方式(不介绍线程方法)

1.通过继承extends方式创建

2.通过实现Runnable接口实现

3.通过继承Callable实现

二、用线程池管理线程


一、常见的创建线程的方式

1.通过继承extends方式实现

a.传统方式创建

最传统创建线程的方式

b.匿名内部类(简化代码)

        直接新建Thead,对其run(implements runnable得到)方法进行重写

匿名内部类创建多线程

c.lamda表达式(简化代码plus)    

            lamda表达式,函数式编程,使代码更加简洁;但是因为是函数式编程,所以具体实现会出现在参数列表中。

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来创建线程池,表义性更强,也更利用理解线程池的实现


ThreadPoolExecutor

ThreadPool各个参数意义:

源自JDK1.8源码

corePoolSize和maximumPoolSize的区别

图片来源简书其他文章

总结:

1.大概介绍了创建多线程的方式,用于日常的学习。难免有纰漏和不足,希望能不吝指正。

2.上述代码图片均自测通过,代码量不大,个人感觉图片更简洁一些

3.关于Callable 、自定义线程池写的较为粗略以及关于@Async 异步注解的使用日后会补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。