1. 基本概念
1. 程序(Program):静态概念
* 程序是指一系列指令的有序集合。指令序列是顺序执行的,直到一条跳转指令(或转移指令)被执行,或者一个中断出现
2. 进程(Process):动态概念
* 狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)
* 广义定义:进程是一个具有一定独立功能的程序关于某数据集合上的一次运行活动
* 进程是系统进行资源分配的基本单位,是操作系统结构的基础
* 通常在一个进程中可以包含若干个线程
3. 线程(Thread):动态概念
* 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位
* 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享该进程的全部系统资源
* 在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位
* 由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量
* 近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标
4. 时间片(Timeslice)
* 又称处理器片(processor slice),是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)
* 现代操作系统(如:Windows、Linux 等)允许同时运行多个进程 —— 例如,你可以在打开音乐播放器听音乐的同时用浏览器浏览网页并下载文件
* 事实上,由于一台计算机通常只有一个CPU,所以永远不可能真正地同时运行多个任务
* 这些进程“看起来像”同时运行的,实则是轮番穿插地运行,由于时间片通常很短(在 Linux 上为 5ms-800ms),所以用户不会感觉的到
2. 一个线程的生命周期
3. 线程的创建
3.1 继承 Thread 类,Thread 是 Runnable 接口的实现类
/** * 1.创建线程:继承 Thread 类 + 重写 run(); * 2.使用线程:实例化线程对象 + 对象.start(); * * 模拟龟兔赛跑 */ public class Rabbit extends Thread{ @Override public void run(){ //线程体 for(int i=0;i<2;i++){ System.out.println("兔子跑了"+i+"步"); } } } public class Tortoise extends Thread{ @Override public void run(){ //线程体 for(int i=0;i<2;i++){ System.out.println("乌龟跑了"+i+"步"); } } } public class Test{ public static void main(String[] args) { //创建子类对象 Rabbit rab = new Rabbit(); Tortoise tor = new Tortoise(); //调用start方法 rab.start();//不要调用 run 方法,不然就是普通的方法调用 tor.start(); for(int i=0;i<2;i++){ System.out.println("main==>"+i); } } } // 运行结果,每一次运行结果是不同的 main==>0 兔子跑了0步 兔子跑了1步 乌龟跑了0步 乌龟跑了1步 兔子跑了2步 main==>1 兔子跑了3步 乌龟跑了2步 兔子跑了4步 main==>2 兔子跑了5步 乌龟跑了3步 main==>3 乌龟跑了4步 main==>4 乌龟跑了5步 main==>5