深入java多线程,认识多线程

1、什么是多线程?

讲到线程,不得不提到进程,而进程跟操作系统相关联。一个进程对应的是一个运行中的应用程序,我们平时上的QQ、浏览器都会有相对应的进程,进程是操作系统运行的基本单位,一个应用程序可能有多同时运行的进程。每个进程都有独立的内存空间。在Windows系统中,一个运行的exe就是一个进程。

进程示例

 

线程是进程的子集,一个进程包含很多线程,每条线程并行执行不同的任务。一条线程是进程内部的一个独立执行单元,是进程中的一个实体,被系统独立调度和分派的基本单位,线程自己不拥有系统资源。我们常说的多线程并发,不是真正的同时运行多个线程,并发是cpu通过cpu调度算法按一定次序执行多个线程,在使用感知上是感觉不到的。并行才是真正上的同时处理同时运行。现在电脑一般都是多核,可以同时处理多个线程,处理速度加快很多。

运行普通java程序需要一条线程(gc线程除外)。当运行一个类时,jvm会在操作系统中启动一个线程,cpu接受到线程执行任务时即开始执行,直至执行完毕。

每当使用 java 命令执行一个类时,实际上都会启动一个 JVM,每一个 JVM 实际上就是在操作系统中启动了一个线程,java 本身具备了垃圾的收集机制,所以在 Java 运行时至少会启动两个线程。由于创建线程的开销比创建进程的开销小的多,所以在开发多任务运行的时候,通常考虑创建多线程,而不是创建多进程。

早期java对多线程的支持很差,算是软肋,可能早期的cpu都是单核为主,硬件性能不高,再加上早期高并发现象很少,不像现在普遍都存在高并发。自jdk1.5以来,java不断在完善对多线程的支持,优化synchronized效率,引入java.util.concurrent包,新创建了很多并发接口和类。在大数据时代,大型小型公司都存在高并发现象,可以说是随处可见,随着时代的发展,高并发场景只会越来越多,cpu处理速度只会加快,java作为现如今主流的服务器端开发语言,对多线程的支持必不可少,多线程也将成为开发语言的重中之重。

 

2、为什么要用多线程,使用多线程好处有哪些?

多线程出现的原因:

为了充分利用cpu资源,为了提高cpu的使用率,采用多线程的方式去同时完成几件事情而不互相干扰。处理大量的IO操作时或处理的情况需要花费大量的时间等等。比如:读写文件,视频图像的处理。现如今cpu处理能力相对来说比较高,大部分时间都会有空闲的cup资源,多线程可以合理使用空闲cpu资源,加快程序运行速度。

  1. 发挥多处理器的强大能力。
  2. 处理异步事件。多线程能一部分线程接收客户端请求,一部分线程处理请求。单线程不能同时处理,阻塞接收请求或者处理请求。
  3. 响应更加灵敏的界面。
  4. 提高程序运行效率。

 

3、多线程使用场景

  • 日常接触的jvm就是一个典型的多线程,一个线程运行java程序,同时另外线程运行gc,时时刻刻进行垃圾扫描回收
  • tomcat容器,一部分线程接收请求,同时另一部分线程处理请求
  • 下载或者处理大文件时,大文件可以分成多个部分,每个线程处理一部分,很大程度加快了处理速度,缩短等待时间
  • 异步处理任务,例如:订单业务处理完,异步发送其他通知或者推送。会员注册完成送积分,送积分需远程访问另外的积分系统,或者访问比较耗时,可以开辟新的线程来处理这样的请求。(非保障性)
  • 备份、复制的操作,例如非常耗时的大文件大数据的复制,备份数据库,可以单独开个线程进行处理。典型的比如mysql数据库的主从复制,每次要主从同步时,mysql服务会在后台开启新线程,同步binlog文件。
  • 大数据处理,单线程处理大数据耗时多,可以把数据分成多份,多个线程处理。例如要校验一万条数据,单线程要花十分钟,将一万条数据分10份,开10个线程处理,每个线程处理一千条,只需大概一分钟。
  • 等等

4、多线程的不利之处

  • 多线程运行需要更多的运行内存
  • 多线程之间频繁切换需耗费大量的cpu性能和时间,一般多线程都是按时间片来运行,时间片用完即切换下一个线程
  • 多线程容易产生死锁、数据共享、数据一致性等问题。使用多线程无疑直接的加大了开发人员的工作量和工作难度,多线程程序比单线程程序的设计要复杂的多,对开发人员的要求也更高。在多线程环境下,会出现各种无法预知的多线程问题,如果保证数据多线程问题也是一大难点,由此,java也新创建对多线程支持的包、类、关键字、锁等。

5、多线程一定快吗

答案当然是不一定,多线程之间切换需要消耗cpu大量性能,不是所有的场景都要使用多线程。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值