新建线程的几种方式
2019-03-06 本文已影响0人
每日一坑
大家在日常工作中不知道有没有经常使用到线程,今天来聊聊新建线程的几种方式;
第一种是大家最熟悉的继承Thread,并重写run方法,

第二种则是实现Runable,并重写run方法

第三种就是实现Callable接口,并重写call方法


第四种则是用线程池创建线程
4.1

4.2

4.3

总的来说,建立线程池有三种方法,建议大家用第二种和第三种,因为第一种不支持自定义拒绝策略,避免不了资源耗尽的风险
大家可以看看https://blog.csdn.net/xiaojin21cen/article/details/87269126
和https://my.oschina.net/wangyuzhan/blog/1559283
前三种方法的优劣在于,实现接口可以在继承其他的类,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。但是要调用本线程就需要用Thread.currentThread()方法,而继承Thread的可以直接用this来代替,
Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。