9.线程

来源:互联网 发布:死寂木偶比利淘宝 编辑:程序博客网 时间:2024/06/03 23:40

1.线程是什么?

线程是比进程更轻量级的执行调度单位,是程序执行流的最小单元(cpu调度的基本单位)。
线程可以把一个进程的资源分配和人物调度分开,各个线程可以共享进程资源,线程拥有自己的堆栈和局部变量。

2.线程的实现

主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理。每个执行了start方法还未结束的Thread实例就是一个线程。
Java API中Thread的大部分方法是Native的,这表明无法用平台无关的手段来实现线程。因此不是Java线程的实现。
内核线程实现、用户线程实现、用户线程加轻量级进程混合实现。

3.Java线程调度

线程调度是指系统为线程分配处理器使用权限的过程。主要调度方式有两种:协同式线程调度和抢占式线程调度。
协同式调度多线程系统:线程的执行时间有线程本身来控制,线程把自己的工作执行完之后,主动通知系统切换到另一个线程上。
缺点:一个线程崩溃,可能导致整个系统崩溃。
抢占式调度系统:每个线程将由系统来分配执行时间,线程的切换不由线程本身控制,线程不能主动的获取执行时间。在这种线程调度方式下,线程执行时间是可控的,不会因为一个线程导致了整个进程阻塞的问题。
Java使用线程的调度方式就是抢占式调度。
Java中使用线程优先级,即让高优先级的线程容易被选择执行。
共有设置了10个级别的线程优先级。

线程的状态

Java语言中定义了五种线程的状态,任意一个时间点,一个线程只能有且只有其中一种状态。

  1. 新建( new ):新创建了一个线程对象。

  2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。

  3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。

  4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:

    4.1. 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。

    4.2. 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。

    4.3. 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。

  5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。
    这里写图片描述

原创粉丝点击