新建线程的几种方式

大家在日常工作中不知道有没有经常使用到线程,今天来聊聊新建线程的几种方式;

第一种是大家最熟悉的继承Thread,并重写run方法,


大家可以自己写看看

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


在主方法调用即可

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


在call里面执行大家想要的操作


用FutureTask封装Callable的实例,这是有返回值的

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

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对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

你可能感兴趣的:(新建线程的几种方式)