Java 中的线程 thread
一、问:线程有哪些状态?
new, runnable, running, waiting, dead
线程状态间的流转
二、问:线程实现方式?
- 实现 Runnable 接口,然后new Thread, 将实现的类对象传入Thread 构造函数
- 继承Thread (细心同学会发现,Thread本身就是实现Runnable 接口)
三、问:举个线程死锁的例子
A: 你先给我钱,我就给你货
B: 你先给我货,我就给你钱
四、问:线程使用场景?
- 常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器)
- servlet多线程
- FTP下载,多线程操作文件
- 数据库用到的多线程
- 分布式计算
- tomcat,tomcat内部采用多线程,上百个客户端访问同一个WEB应用,tomcat接入后就是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用我们的servlet程序,比如doGet或者doPost方法
- 后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集
- 自动作业处理:比如定期备份日志、定期备份数据库
- 异步处理:如发微博、记录日志
- 页面异步处理:比如大批量数据的核对工作(有10万个手机号码,核对哪些是已有用户)
- 数据库的数据分析(待分析的数据太多),数据迁移
- 多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割给多个线程完成
等等
五、使用线程应该注意什么?
线程安全
线程安全是一个很宽泛的说明,简单举例如下:
- 共享数据处理先后顺序
- 资源竞争导致‘死锁’
- 线程脱离监控: 线程新建和运行脱离管控,导致整个系统异常