Java之多线程(十三)

多线程实际是将一个程序任务分成几个可以同时并发执行的子任务,那我们就需要先了解其基本概念,然后再进行深度的学习


  • 程序
    含有指令和数据的文件,被存储在磁盘或其它的数据存储设备中,即程序是静态的代码

  • 进程
    程序的一次执行过程,是系统运行程序的基本单位,系统运行一个进程即是一个从创建,运行到消亡的过程
    每个进程之间是独立的,除非利用某些某些手段通信,或是通过操作系统产生交互作用,否则基本上各进程不知道彼此的存在

  • 多任务
    一个系统中同时运行多个进程,即有多个独立运行的任务,每个任务对应一个进程

  • 线程
    与进程相似,但线程是一个比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,形成多条执行路径,但是同类的多个线程共享同一块内存空间和一组系统资源,故系统在产生一个线程或是在各个线程之间作切换工作时,负担要比进程小得多

注意:
多任务与多线程的区别
多任务是针对操作系统而言的,表示操作系统可以同时运行多个应用程序,而多线程是指一个进程而言的,表示一个进程内部可以同时执行多个线程

线程的状态与生命周期

每个Java程序都有一个默认的主线程,对于应用程序来说,其主线程是main方法执行的线程,对小程序来说,其主线程是指挥浏览器加载并执行Java小程序

要想实现多线程,就必须在主线程里面创建新线程对象
Java使用Thread类及其子类的对象来表示线程,新建线程在一个完整的生命周期内要经历5种状态

  1. 新建状态
    当一个Thread类或其子类的对象被声明并创建,但未被执行的这段时间内,处于一种特殊的新建状态
    此时线程对象已经被分配了内存空间和其他资源,并已被初始化,但是该线程未被调度

  2. 就绪状态
    也称可运行状态,具备了运行的条件,而原来处于阻塞状态的线程被解除阻塞后也将进入就绪状态

  3. 运行状态
    就绪状态的线程被调度并获得CPU资源时,便进入了运行状态,该线程表示线程正在运行,拥有了对CPU的控制权

注意:
处于运行状态的线程在下述情况将让出CPU控制权
线程运行完毕
有比当前线程优先级更高的线程处于就绪状态
线程主动睡眠一段时间
线程在等待某一资源

  1. 阻塞状态
    一个正在执行的线程如果在特殊情况下,将让出CPU并暂时中止自己的执行,线程处于这种不可运行的状态

进入阻塞状态的几种情况
一调用了sleep()或yield()方法
二等待一个条件变量,线程调用wait()方法
三该线程与另一线程join()在一起

  1. 消亡状态
    不具有继续执行的能力
    原因有两个
    一正常运行的线程完成了它的全部工作,即执行完了run()方法的最后一条语句推出
    二进程因故停止运行时,该进程中所有线程被强行终止
线程的调度与优先级

调度
指在各个线程之间分配CPU资源,多个线程的并发执行实际上是通过一个调度来执行的
模型有分时模型和抢占模型
分时:CPU资源按时间片来分配,获得CPU资源的线程只能在指定的时间片内执行,一旦时间片使用完毕,就必须把CPU让给另一个处于就绪状态的线程
抢占:当前活动的线程一旦获得执行权,将一直执行下去,直到执行完或由于某种原因主动放弃执行权

优先级
决定了线程被CPU执行的优先顺序
Java中优先级从低到高以整数1-10表示,Thread类有3个关于线程的优先级的静态变量,MIN_PRIORITY表示最小优先级,通常为1,MAX_PRIORITY表示最高优先级,通常为10,NORM_PRIORITY表示普通优先级,通常为5

注意:
新建一个线程,系统会遵循如下原则为其指定优先级

  1. 新建线程将继承创建它的父线程的优先级,父线程是指创建新线程对象语句所在的线程,他可能是程序的主线程,也可能是某一个用户的自定义线程
  2. 一般情况下,主线程具有普通优先级,
  3. 如果要改变线程的优先级,可以通过调用线程对象的setPriority()方法来进行设置
Java的Thread线程类与Runnable接口

实现多线程的方法有两种
一继承java.lang包里的Thread类,另一个是用户在定义自己的类中实现Runnable接口

我们只要知道如何构建就可以了

发布了78 篇原创文章 · 获赞 181 · 访问量 8675

猜你喜欢

转载自blog.csdn.net/qq_44790423/article/details/102078784