创建线程的三种方式
继承Thread类
1、定义Thread类的子类,并重写该类的run()方法,run()方法被称为线程执行体。
2、创建Thread子类的实例,即创建线程对象。
3、调用线程对象的start()方法启动该线程。
代码示例
上面程序显式的创建了两个线程,但是实际上程序有三个线程,其中包括主线程。
当Java程序开始运行时,程序至少会创建一个主线程,主线程的执行体不是由run()方法确定的,而是由main()方法确定的。
使用继承Thread类的方法创建线程时,多个线程之间无法共享线程类的实例变量。
实现Runnable接口
1、定义Runnable接口的实现类,并重写该接口的run()方法。
2、创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
3、调用线程对象的start()方法来启动该线程。
代码示例
采用Runnable接口的方式创建的多个线程可以共享线程类的实例属性。因为这种方式下,程序所创建的Runnable对象只是线程的target,多个线程可以共享同一个target。
使用Callable和Future
1、创建Callable接口的实现类,并实现call()方法,该call()方法作为线程执行体,且该call()方法有返回值。
2、创建Callable实现类的实例,使用Future Task类来包装Callable对象,该Future Task对象封装了Callable对象的call()方法的返回值。
3、使用Future Task对象作为Thread对象的target创建并启动新线程。
4、调用Future Task对象的get()方法来获得子线程执行结束后的返回值。
代码示例
call()方法比run()方法功能更强大.call()方法可以有返回值,可以声明抛出异常。
Callable接口有泛型限制,Callable接口里的泛型形参类型与call()方法返回值类型相同。
创建线程的三种方式对比
实现Runnable接口和实现Callable接口的方式基本相同,只是Callable接口里定义的方法有返回值,可以声明抛出异常,大体上可以归结为一大类。这种方式与继承Thread方式之间的主要差别是采用实现Runnable,Callable接口创建多线程:
1、线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。
2、多个线程可以共享同一个target对象,非常适合多个相同线程来处理同一份资源的情况(面向对象)。
3、如果要访问当前线程,必须使用Thread.currentThread()方法,比较复杂。
采用继承Thread类的方式创建多线程:
1、因为线程类已经继承了Thread类,所以不能再继承其他父类。
2、如果要访问当前线程,直接使用this即可获得。
鉴于上述分析,通常推荐使用实现接口的方式来创建多线程,实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心。
本文转自:小组15级成员--董孟愿
原文地址:
http://blog.csdn.net/dongmengyuan1020/article/details/79346435
(更多详细内容,点击左下角【阅读原文】)
- 南京给绿道定下 这三种色彩
- 光大银行创建新一代净值型理财产品 ——“七彩阳光系列”,为投
- 淮南“文明行车 文明行走 全民行动”主题创建活动启动
- 谁是影响营销业发展的第三种力量?
- 清明前后三种菜,降火养五脏,一定要吃全!
- 衡中家长:80%的孩子学习差,错在把这三种行为当努力!
- 中美贸易战升级,楼市无非就这三种情况~
- 有这好事?农村这三种“空心房”要拆,还补偿几万十几万?
- 复盘创建的四类股票池与筛选股票的注意事项
- 【BIM丨每日一技】tekla常规楼梯的创建