【JavaCore】并发2

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

在本文中,你将会了解并掌握线程的状态中两种状态。

1. 线程状态

线程可以有如下6种状态:

  • New - 新建
  • Runnable - 可运行
  • Blocked - 阻塞
  • Waiting - 等待
  • Timed waiting - 计时等待
  • Terminated - 终止

我们在接下来的文章中将分别对每一种状态进行解释。
如果我们需要确定一个线程的当前状态,只需要调用getState方法。

1.1 新建线程

当用new操作符创建一个新线程时,比如new Thread(r),这个线程还没有开始运行。这表示线程的状态是新建的状态(New)。当一个线程处于新建状态时,程序还没有开始运行线程中的代码。在线程运行之前还有一些基础工作需要去做。

1.2 可运行线程

当我们开始调用start方法,线程就处于可运行(runnable)状态。一个可运行的线程可能正在运行也可能没有运行。 要由操作系统为线程提供具体的运行时间。

当一个线程开始运行,它不一定始终保持运行。实际上,运行中的线程有时需要暂停,让其他线程有机会运行。

线程调度的细节取决于操作系统提供的服务。抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统便会剥夺该线程的运行权,并给另一个线程一个机会来运行。当选择下一个线程时,操作系统会考虑线程的优先级。

现在所有的桌面以及服务器操作系统都使用抢占式调度。但是,像手机这样的小型设备可能使用协作式调度。在这样的设备中,一个线程只有在调用yield方法或者被阻塞或等待时才失去控制权。

static void yield()

使当前正在执行的线程向另一个线程交出运行权。注意这是一个静态方法。

在有多个处理器的机器上,每一个处理器运行一个线程,可以有多个线程并行运行。当然,如果线程的数目多于处理器的数目,调度器还是需要分配时间片。

感谢观看,这是Java并发系列的第二篇文章,如果您有兴趣,可以关注一下我,方便查看后续文章,一起学习,共同进步,不胜感激!