java的多线程

到现在为止,我们所书写的程序在任意时刻只能运行一件任务。编程问题中的大部分都可以通过这种顺序编程方式来解决。然而,在某些情况下,如果能够并行的运行程序中的多个部分,那么就可以使程序运行速度得到极大的提升。Java语言内置了多线程技术。在这我们将讨论如何使用Java中提供的多线程技术,实现在一个程序中并发运行多个任务的功能。

1. 多任务处理

现代计算机都是可以同时执行多项任务的。比如,我可以同时运行微信、QQ、钉钉等一系列软件。对我们来说,这些软件是同步在运行的,但真相并非如此。当我们在同时运行多个软件时,实际上,对一个CPU而言,它在某一时间点上只能运行一个任务,可以同时运行多个任务是CPU对多个任务同时交替执行而实现的。我们之所以感觉不到中断现象,是因为相对于人而言,CPU的速度实在是太快了。

2. 进程和线程

计算机中可以并发运行多个程序通常是由操作系统实现的。一个正在运行的程序通常称为一个进程(Process),每个进程都有自己独立运行的一块内存空间,每个进程的内部数据和状态都是完全独立的。

在进程内部有时会需要同时执行多个子任务。例如,我们在使用Word时,可以一边打字,一边拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。

那进程和线程的关系是怎样的呢?

一个进程可以包含一个或多个线程,但至少会有一个线程。

线程存在于进程之中,二者之间主要区别在于,每个进程都需要操作系统为其分配独立的内存空间,而同一进程中的所有线程都在同一工作空间中工作,这些线程可以共享同一块内存和系统资源。

注意:操作系统调度的最小任务单位其实不是进程而是线程。

2.1 实现多任务的几种方式

  1. 多进程模式(每个进程只有一个线程)

  2. 多线程模式(一个进程有多个线程)

  3. 多进程+多线程模式(最复杂)

具体采用那种方式,要考虑到进程和线程的特点。

两者对比:

  1. 创建进程比创建线程开销大

  2. 进程间通信比线程间通信要慢,因为线程间通信就是读写同一个变量,速度很快。

  3. 多进程稳定性比多线程高,因为在多进程的情况下,一个进程崩溃不会影响其他进程,而在多线程的情况下,任何一个线程崩溃都会导致整个进程崩溃。

3. 多线程

Java语言内置了多线程支持,一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main方法,在main方法内部,我们有可以启动多个线程,此外,JVM还有负责垃圾回收的其他工作线程等。简单的说,main方法一执行,就开启了主线程。每个进程至少都有一个主线程。

主进程的特点:最先开始、最先结束、产生其他的子线程、子线程结束后,清理子线程占用的内存资源。

线程是一个动态执行的过程,它也有一个从产生到死亡的过程,而这个过程呢就是我们所谓的生命周期。那我们就从线程的生命周期开始学习。

3.1 一个线程的生命周期

线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、死亡。

  1. 新建:使用new方法,new出线程,此时仅由Java虚拟机为其分配内存,并初始化成员变量的值。--此时仅为对象

  2. 就绪:调用线程的start方法后,此时线程处于等待CPU调度执行的阶段。-- 不是执行了start方法后,此线程就会立刻执行。

  3. 运行:当处于就绪的线程被调度并获得CPU资源时,便进入运行状态。(当处于就绪状态的线程获得CPU,他就会执行run方法)

    对于一个单核CPU而言,同时只能执行一条指令,而JVM通过快速切换线程执行指令来达到多线程的,只是这种切换速度很快,我们感知不到罢了。为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。

  4. 阻塞:线程处于运行状态时,可能因为某些原因导致运行状态的线程变成了阻塞状态。

    原因:等待I/O流的输入/输出、等待网络资源(网速)、调用sleep方法、调用wait方法、其他线程执行join方法、线程优先级比较低

  5. 死亡:run方法执行完成;

    线程正常结束、线程抛出未被捕获的异常或错误;

    直接调用线程的stop方法结束线程--该方法容易导致死锁,通 常不建议使用。

当线程进入运行状态后,一般的操作系统是采用抢占式的方式来让线程获取CPU,所以CPU需要在多条线程之间切换,于是线程状态也会多次在运行、阻塞、就绪之间切换。

举例:去饭店吃饭,准备去吃饭就是新建状态(new),饭店生意火爆要排队,排队就是就绪状态(Runnable),轮到你了,吃饭就是运行状态(Running),准备发现没有碗筷,要等待别人给你送过来,这个状态就是阻塞(Blocked),等你吃完饭出来,吃饭这个事情就结束了,就是死亡状态了。

3.2 线程的创建和启动

  1. 继承Thread类,并重写run方法

    pub
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值