多线程之基础

多线程之基础

线程状态

  • 新建状态(NEW)

  • 就绪状态(RUNNABLE) : 线程调用start后,线程处于runnbale (并没有开始运行,等待系统分配cpu时间片)

  • 运行状态(RUNNING)

    当线程获得了 CPU 时间片,CPU 调度处于就绪状态的线程并执行 run()方法的线程执行体,则该线程处于运行状态

    ​ 如果计算机只有一个CPU,那么在任何时刻只有一个线程处于运行状态; ​ 如果在一个多处理器的机器上,将会有多个线程并行执行,处于运行状态; ​ 当线程数大于处理器数时,依然会存在多个线程在同一个CPU上轮换的现象;

  • 阻塞状态(BLOCKED), 如synchronize 锁

  • 等待状态(WAITING)通过wait()方法进行等待的线程等待一个notify()或者notifyAll()方法; 通过join()方法进行等待的线程等待目标线程运行结束而唤醒;

  • 超时等待状态(TIMED_WAITING) 例如sleep

Join Yield

join

main()
{
threadA.join(); //等线程A执行完,再执行主线程
.............
}

yield

Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程

yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

线程调度

优先级

操作系统采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待着下次分配。线程分配到的时间片多少也就决定了线程使用处理器资源的多少,而线程优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。

注意: 线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会 Java 线程对于优先级的设定。

守护线程

线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会 Java 线程对于优先级的设定。

当一个 Java 应用只有守护线程的时候,虚拟机就会自然退出

中断

个线程都关联了一个中断状态,用 boolean 值表示,初始值为 false。中断一个线程,其实就是设置了这个线程的中断状态 boolean 值为 true。(中断只是一个状态,处于中断状态的线程不一定要停止运行。)

自动感知中断

以下方法会自动感知中断:

Object 类的 wait()、wait(long)、wait(long, int)
Thread 类的 join()、join(long)、join(long, int)、sleep(long)、sleep(long, int)

当一个线程处于 sleep、wait、join 这三种状态之一时,如果此时线程中断状态为 true,那么就会抛出一个 InterruptedException 的异常,并将中断状态重新设置为 false。