同花顺
有很多人对多线程很陌生,离它很遥远,没有使用过多线程。
但实际上处处都有多线程的痕迹。
举一个最基础的例子:
Java程序的进程里至少包含两个进程,主线程也就是main()方法线程,另一个是垃圾回收机制线程。
我们的java程序就不是单线程跑的。
多线程应用场景
1、短信验证码登录时,一般单独开一个线程去调用这个短信接口,主线程返回。
2、前端经常使用的ajax发送请求方法之所以是异步就是多线程。
3、图片上传业务。
4、文件服务中,对各节点上传文件进行分类,阶段很多,节点很多,速度非常慢,一两百个文件,就耗时700ms,经过使用多线程处理后,几十ms就解决了,效率提高了十倍,美滋滋,用户再也体会不到那种卡顿的感觉了。
5、tomcat以多线程的方式响应请求,上百个客户端访问tomcat,来一个请求,就用一个线程来接。
6、项目连接数据库时经常使用的druid连接池。
你不知道我的存在,但我一直都在。
多线程优势
为什么这么多地方都是用多线程?
四个轮子比1个轮子跑得快。
根本原因是,提高CPU的资源利用率。
多核CPU,跑单线程程序,使用一个CPU,其他CPU都在那闲着,刚吃不干,这不能忍。
直接开多个线程,让线程去争夺CPU的执行权。
线程的种类
君生我未生,君死我未死(用户线程)
不随主进程结束而结束,主线程走完了,用户线程不停继续走。
你go die,我不 go die。
我们一般自己创建的线程,比如线程池都是用户线程。
君生我也生,君死我也死(守护线程)
主线程比如main()结束,守护线程也会停止。
设置线程为守护线程,通过设置一个参数即可。
thread.setDaemon(true);
守护线程作用:
最典型的守护线程就是垃圾回收线程。
如果java进程中没有活着的线程了,垃圾回收机制也会自己死亡。
同生共死。 -_-||
线程停止
1、设置退出标志,使线程正常退出。
比如售票窗口是一直开着的,这个线程进入无限循环状态,
我们可以在外部使用主线程修改while()中的判断条件,让它为false,就会终止循环退出线程。
2、使用interrupt()方法中断线程,会抛出一个异常进行中断线程。
3、使用stop方法强行终止线程(不推荐,已废弃,不安全)。
线程优先级
一共1-10十个等级,默认是5,最高是10。
thread.setPriority(10);
优先级的应用场景:
如果八核CPU处理3个线程,无论优先级高低,每个线程都是单独一个CPU执行,也就是说你设置的优先级就是无效的。
如果开启10个线程,让四核CPU处理,这里线程优先级就会生效,竞争CPU资源。