多线程的使用
首先我们要明确 什么时候需要使用多线程?
1.阻塞 如果系统中出现了阻塞现象,则可以根据多线程技术来提高运行效率
2.依赖 多个业务并行时,如果某些业务发生了阻塞,而其他业务并不依赖于被阻塞的业务的执行结果,这时可以用多线程来提高运行效率
一个简单的例子:
假如现在有一个请求,该请求服务端的处理需要执行三个很慢的IO操作(比如是查询数据库或者文件) 而我们需要的步骤是:
1.读取文件1(假设耗时10ms)
2.处理文件1的数据(1ms)
3.读取文件2(10ms)
4.处理文件2的数据(1ms)
5.读取文件3(10ms)
6.处理文件3的数据(1ms)
7.整合结果(1ms)
如果单个线程进行整体的操作的话,我们需要34ms,但是我们显然可以发现,步骤12、34、56不是相互依赖的,即不依赖于前几个步骤的
结果 所以我们完全可以使用三个线程来操作12、34、56 就只需要12ms了
常见的多线程使用场景:
常见的浏览器,Web服务器,Web处理请求
servlet多线程
数据库用到的多线程
分布式计算
...
思考
总之,使用多线程都是为了充分利用cpu的资源,提高程序执行效率而进行的操作。当我们发现一个业务的逻辑很消耗时间、资源
而且业务之间不是相互阻塞的,那我们就可以考虑使用多线程。
但是,多个线程之间的执行的时间、顺序是不确定的,因此使用多线程也会带来一定的风险,以及有可能对我们业务的逻辑有一些不符。
虽然在java中,我们可以为线程设置优先级,但是即使确定了优先级,线程优先级高的线程还是不一定会先执行
在java中,线程我是通过映射到系统的原生线程上来实现的,所以线程的调度最终还是在一定程度上取决于操作系统。所以,即使我们为某个线程设置了优先级,他也不一定会被先执行。优先级设置的高(比如10)可能情况还比较好,若是数字比较低了,因为每个线程默认级别是5,可能在执行过程中,我们设置的优先级作用很小,细如蚊蝇。