进程与线程

进程: 是计算机中已运行程序的实体。进程为曾经是分时系统的基本运作单位。在面向进程设计的系统(如早期的UNIX,Linux 2.4及更早的版本)中,进程是程序的基本执行实体;在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中, 进程本身不是基本运行单位,而是线程的容器。程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。

线程: 是比进程更轻量级的调度执行单位,线程的引入可以把一个进程的资源分配和执行调度分开,各个线程既可以共享资源(内存地址,文件I/O) 又可以独立调度(独享CPU)。它的出现可以使计算机充分的发挥并发计算能力.

JAVA线程实现

操作系统实现线程主要有3中方式:

  • 使用内核线程(kernel-level Thread)实现
  • 使用用户线程(User Thread)实现
  • 使用用户线程加轻量级进程(Light Wright Process)混合实现

JAVA本身因为其跨平台性,因此会为我们屏蔽这些线程实现上的差异,通常来说一条Java线程就映射到一条轻量级进程中。 具体点,并且和其他所有元素一样,都是对象,Java提供了两种方式来创建线程:

Runnable接口

Runnable给意图执行线程的类提供了实现标准,继承该接口的类必须定义一个没有任何参数的run方法。 接口是给那些希望在活动时执行代码的对象提供公共协议,举个例子,Thread实现了Runnable。 活跃的简单来说是一个线程已经启动但是还没有停止。 此外,Runnable接口为希望活跃的类提供了避免子类化Thread的方法。一个类实现Runnable接口可以不需要子类化Thread通过将自己传递给实例化Thread的实例来运行。大多数情况,Runnable接口当你只希望重写run方法不需要重写其他方法时被使用,这是很重要的因为类不应该被子类化除非我们想要修改或增强其基础行为。

Thread类

一个Thread时程序里的执行线程。java虚拟机允许应用程序同时执行多个线程。 每个线程都有一个优先级。高优先级的线程优先执行与低优先级的。每个线程都可以被当做守护线程 新的线程会继承被创建时线程的属性。 当Java虚拟机启动时,通常会有一个非守护线程(main函数等启动类的某个方法),虚拟机会持续执行线程直到发生了下面的情况

  • 正在运行的类调用了exit方法并且安全管理器允许了退出操作
  • 所有的非守护线程都已经结束

JAVA线程的基本属性

Thread类中有一些保存信息的属性,这些属性可以用来标示线程,显示线程的状态或者控制线程的优先级。

  • ID:保存了线程的唯一标示,不允许修改。
  • Name:保存线程的名字。
  • Priority:保存了线程对象的优先级。线程的优先级是从1到10,1是最低级,10是最高级。
  • Status:保存了线程的状态。线程的状态有6种:new,runnable,blocked,waiting,time waiting,terminated。

关于线程状态之间的转化见下图 JAVA thread state machine