gzyueqian
13352868059

在Java培训开发学习中想要实现多线程的3种方法

更新时间: 2018-08-29 14:38:29来源: java培训浏览量:4640

一、什么是多线程?
在正式编写文章前小编先引用网上别人的一段话来加深大家的对文章的理解:
单进程单线程等于:一个人在一个桌子上吃菜。
单进程多线程等于:多个人在同一个桌子上一起吃菜。
多进程单线程等于:多个人每个人在自己的桌子上吃菜。
多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。资源共享就会发生冲突争抢。
使用多线程的优点(相对使用多进程来说):
进程之间不能共享内存,但线程之间共享内存非常容易。
系统创建线程所分配的资源相对创建进程而言,代价非常小。
二、Java中实现多线程的3种方法介绍和比较
继承Thread类
实现Runnable接口
实现Callable接口
这三种方法的介绍和比较
一、实现Runnable接口相比继承Thread类有如下优势
1)可以避免由于Java的单继承特性而带来的局限
2)增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
3)适合多个相同程序代码的线程去处理同一资源的情况
4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类
二、实现Runnable接口和实现Callable接口的区别
1)Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
2)实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果
3)Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
4)加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取返回结果,当不调用此方法时,主线程不会阻塞
三、Runnable、Thread、Callable案例
3.1、种实现方法—继承Thread类
继承Thread类,需要覆盖方法 run()方法,在创建Thread类的子类时需要重写 run(),加入线程所要执行的代即可。

3.2、第二种实现方法—实现Runnable接口
如果要实现多继承就得要用implements,Java 提供了接口 java.lang.Runnable 来解决上边的问题。

Runnable是可以共享数据的,多个Thread可以同时加载一个Runnable,当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源是被共享的,所以使用Runnable更加的灵活。PS:需要解决共享之后产生的资源竞争问题。

3.3、第三种—实现Callable接口
Runnable是执行工作的独立任务,但是它不返回任何值。如果你希望任务在完成的能返回一个值,那么可以实现Callable接口而不是Runnable接口。在Java SE5中引入的Callable是一种具有类型参数的泛型,它的参数类型表示的是从方法call()(不是run())中返回的值。


四、Runnable、Thread、Callable总结
再来看看它们三个之间的总结。
4.1、实现Runnable接口相比继承Thread类有如下优势
1)可以避免由于Java的单继承特性而带来的局限
2)增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
3)适合多个相同程序代码的线程去处理同一资源的情况
4)线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类

4.2、实现Runnable接口和实现Callable接口的区别
1)Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
2)实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果
3)Callable接口的call()方法允许抛出异常,而Runnable接口的run()方法的异常只能在内部消化,不能继续上抛
4)加入线程池运行,Runnable使用ExecutorService的execute方法,Callable使用submit方法
注:Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取返回结果,当不调用此方法时,主线程不会阻塞
五、其他

当然,关于多线程,只掌握这些肯定不够。还有多线程的实现原理,还有深入理解Java线程池,这样才能更好地使用多线程。在后面小编也会在文章中会不断的更新。

粤嵌科技创办于2005年是一家IT高新技术企业,专注IT职业教育13年,主要培训课程分别有嵌入式培训Java培训、Unity游戏开发、Python人工智能、HTML5前端开发、全栈UI设计、网络营销、CCIE网络等专业课程


免费预约试听课