大家在日常工作中不知道有没有经常使用到线程,今天来聊聊新建线程的几种方式;
第一种是大家最熟悉的继承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对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。