前言
多线程编程,是 “多核时代” 提升计算性能的关键因素之一,亦属于开发者必须掌握的核心技能。本片文章小编带你从六个知识点剖析JAVA多线程,将针对于 Java 多线程编程,进行基础的阐述!
主要内容包括:
一、概述
二、Thread 类
三、创建线程:继承 Thread 类
四、创建线程:实现 Runnable 接口
五、线程优先级
六、线程的生命周期
七、同步代码块
一、概述
1. 进程和线程
- 进程:进程指正在运行的程序。
- 线程:线程是进程中的一个执行单元,是程序 使用cpu 的基本单位(调度)。负责当前进程中程序的执行。是进程中单个顺序控制流(执行路径),是一条单独执行的路径
- 一个程序运行后至少有一个进程,一个进程中可以包含多个线程
- 在操作系统中,进程是资源分配的基本单位,线程是调度的基本单位。
在没有出现线程之前, 进程既是操作系统进行资源分配的基本单位,又是调度的基本单位
- 单线程程序:若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。程序只有一条执行路径
- 多线程程序:若有多个任务可以同时执行。程序有多条执行路径
操作系统发展:单道批处理操作——>多道批处理操作系统——>分时操作系统(多进程的)——>线程 批处理:程序在执行过程中,不会响应用户的请求 单道批处理操作:一次只能运行一个程序,如果要在计算机运行多个程序,这多个程序,只能一个一个的顺序执行,如果这个正在运行的程序,在运行过程中,执行了一些非常耗时的IO操作(传输数据的过程是没有使用到cpu),这样一来,cpu就闲下来了,但是cpu是计算机中,最为昂贵的 多道批处理操作系统:同时运行多个程序,显著的提高了cpu的利用率,但是我们一旦一个,程序运行起来,都是是需要使用计算机资源的 分时操作系统:每一个进程,有一个固定的时间片,在运行一个固定的时间片后,紧接着轮到下一个进程运行(切换)
- 为什么还会有线程呢? 进程切换的代价太高了,这样一来,每一次进程切换,都需要付出不小的额外的代价,为了减小进程切换的代价,引入了线程,提高CPU的利用率
2. 线程调度
- 分时调度:所有线程 轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
- 抢占式调度:优先让 优先级高的 线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度
- 体现了:程序运行的不确定性
- CPU 使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
- 多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
3. 线程控制
- 线程睡眠 static void sleep(long millis):在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
//让主线程,休眠3秒 Thread.sleep(3000); //sleep新的写法 TimeUnit.SECONDS.sleep(3); System.out.println("睡醒了"); - 线程加入 public final void join():(让当前线程)等待该线程(新加入的线程终止)终止。
SecondThread sec = new SecondThread("zs"); SecondThread thr = new SecondThread("lsii"); SecondThread fou = new SecondThread("wangwu");
//启动这三个线程对象 sec.start(); //sec线程上调用join方法 ,让当前线程(main)等待sec线程执行完毕 sec.join(); thr.start(); fou.start(); - 线程礼让public static void yield():暂