Java与线程

来源:互联网 发布:广州易娱网络怎么样 编辑:程序博客网 时间:2024/06/09 14:19

线程的实现

线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个进程既可以进行共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。

主流的操作系统都提供了线程实现,Java语言则提供了在不同硬件和操作系统下对线程操作的统一操作,每个已经执行start()且还未结束的java.lang.Thread类的实例就代表一个线程。Tread类与大部分Java API有显著的差别,其所有的关键方法都声明为Native的,在Java API中,一个Native方法往往意味着这个方法没有使用或无法使用平台无关的手段来实现(也可能是为了执行效率而使用Native方法,但通常最高效的手段也就是平台相关的手段)

实现线程有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

Java的线程调度

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度(Cooperative Threads-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling)。

协同式线程调度:一个线程把自己的工作执行完了之后,主动通知系统切换到另外一个线程上。最大好处是实现简单,且由于线程把自己的事情干完才会通知线程切换,切换动作对于线程自己是可知的,所以没有线程同步的问题。坏处:线程执行时间不可控,如果一个线程坚持不让出CPU执行时间,可能会线程阻塞。

抢占式操作系统:由系统分配线程执行时间,线程的切换不由线程本身决定,因此也就不会有一个线程导致整个进程阻塞的问题,Java使用的线程调度方式就是抢占式调度。

状态转换

Java语言定义了5种线程状态,在任意一个时间点,一个线程只能有且只有一个状态,分别如下:

  • 新建(New):创建后尚未启动的线程。
  • 运行(Runable):处于此状态的线程有可能正在执行,也可能正在等待CPU为它分配执行时间。
  • 无限期等待(Waiting):不会被CPU分配执行时间,要等待被其他线程显式唤醒。
  • 限时等待(Timed Waiting):也不会被分配CPU执行时间,不过不需要显式被唤醒,一定时间之后会由系统自动唤醒。
  • 阻塞(Blocked):线程被阻塞了,与等待状态的区别:阻塞状态在等待着获取一个排他锁,这个事件将在另外一个线程放弃这个锁的时候发生;而等待则是等待一段时间,或唤醒动作的发生。
  • 结束(Terminated):已终止线程的线程状态,线程已经结束运行。
原创粉丝点击