什么时候用多线程、为什么要设计多线程?
1、为什么要用多线程?
? ? ? ? 现在的计算机系统一般都是多核cpu的,而在任意一个时刻,每个cpu内核都能执行一个线程,所以为了利用多核cpu的优势,我们的程序也不应该只支持单线程运行,我们应该在适合的地方进行多线程编程,让程序在执行过程中,能够有机会用多个线程同时占用多个cpu内核去执行,这样能提高程序的执行效率,提升系统的吞吐能力。
2、什么时候用多线程?
? ? ? ? 会使用到多线程的场景主要有:高并发请求的并发处理、耗时的大任务拆分成多个操作用多个线程并发执行、异步任务的处理。
? ? ? ? 具体点来说:
? ? ? ? 1、当我们的系统面临着高并发请求时,系统也应该用多个线程去并发处理这些请求,这是请求层面的多线程处理,web容器已经替我们做了这个实现,比如:Tomcat,Tomcat是一个用NIO来实现的高性能的http服务器,它会不断监听客户端请求,当channel上发生了客户端请求事件时,它会将这个事件封装为一个任务交给它所维护着的线程池去处理。
? ? ? ? 2、当我们有一个耗时大任务是由多个操作组成的,而这多个操作即便是并发执行也不会产生相互影响,不会导致数据不一致的问题发生,那么这个时候我们也可以用多线程进行并行处理。如:某个方法中包含了三个耗时的io操作,分别为读取文件A、B、C,三个读取操作分别耗时10ms、15ms、10ms,如果用单线程去执行这个方法,那总耗时为35ms,如果用三个线程并行执行这三个io操作,那么总耗时只有15ms,大大提升了执行性能。
? ? ? ? 3、当我们有一个非常重要的功能,而在这个功能内部又包含了一个不太重要却又非常耗时的操作,并且这个操作的结果不会对当前功能的主要业务逻辑产生影响,这个时候,我们就可以将这个操作封装为一个任务提交到线程池去处理,提交后当前线程即可返回。如:网站的注册功能,注册成功之后要给用户发邮件,邮件是否成功发送并不影响注册逻辑,发邮件的操作就可以交给线程池处理。
? ? ? ? 总之,使用多线程的前提是多核cpu,让多线程并发也是为了充分利用多核cpu,在单核cpu服务器上运行多线程程序是没有意义的,因为有再多线程,cpu内核也只有一个,同一时刻,只能有一个线程的一条指令能得到执行。在多核cpu服务器上运行多线程程序时,线程数量也不是越多越好,因为:1、每创建一个线程对象,jvm都要为它分配栈内存和程序计数器,越多的线程带来的内存开销越大,还有可能因线程创建过多而抛出OOM异常;2、当内存中线程数量达到一定的值之后,再去创建线程反而会带来CPU性能下降,因为多个线程是轮流获取到cpu的执行权,线程之间存在上下文切换,而线程的上下文切换是非常消耗cpu的一个操作,太多的线程会导致上下文切换太频繁,所以我们应该用线程池去管理线程,控制好线程数量,以达到cpu的最高利用率。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!