线程知识总结

1. 为什么使用线程?

a)发挥多核CPU的优势
随着工业的进步,现在人们使用的笔记本、台式机及应用服务器至少是双核、4核、8核、甚至16核,如果是单线程的程序,那么双核CPU就要浪费50%,4核就要浪费75%。单核cpu上所谓的多线程是假的多线程,同一时间只能处理一段逻辑,只不过线程之间切换比较快,看着像多个线程同时运行。多核cpu上的线程才是正真的多线程,可以同时运行多段逻辑,因此多线程可以正真发挥多核cpu的优势,达到充分利用CPU的目的。
b)防止阻塞
从程序运行效率的角度来看,单核cpu不但不会发挥出多线程的优势,反而会因为在单核cpu上运行多线程导致线程切换而减低程序整体效率。但是单核CPU我们还要应用多线程,就是为了防止阻塞。试想,如果单核CPU使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据,对方迟迟未返回数据也没有设置超时,那么整个程序在数据返回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行,其中一条线程阻塞,不影响其他线程的运行。
3)便于建模
假设有一个大任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是把这个大任务分解成多个小任务,分别建立模型,并通过多个线程运行这些任务,就简单很多。

2. 创建线程的方式?

a)继承thread类
步骤:
1》定义Thread的子类,并重写Thread的run方法
2》创建Thread子类的实例,即创建了线程对象
3》调用线程对象的start()方法来启动该线程
b)实现Runnable接口
步骤:
1》定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体
2》创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象
3》调用线程对象的start()方法来启动该线程
c)通过Callable和Future创建线程
步骤:
1》创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值
2》创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值
3》使用FutureTask对象作为Thread对象的target创建并启动新线程
4》调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

3.Thread、Runnable和Callable比较

a)Runnable接口、Callable接口解决多继承的问题;但同时带来编程稍微复杂问题,如果要访问当前线程,则必须使用Thread.currentThread()方法
b)Thread单继承,但是编程简单
b)Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已
c)Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。这其实是很有用的一个特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务,真的是非常有用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值