Java多线程(实现多线程)

一、实现多线程

1.1 进程

是系统进行资源分配和调用的独立单位(通俗讲就是操作系统中执行的一个子程序,包含了三部分:虚拟CPU、代码、数据)

  • 是系统进行资源分配和调用的独立单位
  • 每一个进程都有它自己的内存空间和系统资源

1.2 线程

是进程中的单个顺序控制流,是一条执行路径

  • 单线程:一个进程只有一条执行路径
  • 多线程:一个进程有多条执行路径

1.3 多线程的实现方式

方式1:继承Thread类

  1. 定义一个类继承自Thread类
  2. 在定义的类中重写run()方法
  3. 创建自定义类的对象
  4. 启动线程

注意:

  • run()方法是用来封装被线程执行的代码的相当于普通方法的调用
  • start()方法用来启动线程,然后由JVM调用此线程的run()方法

因为我们不知道输出的内容分别属于那个线程,所以还需要设置和获取线程名称

1.4设置和获取线程名称

Thread类中设置和获取线程名称的方法

  • void setName(String name):将此线程的名称改为等于参数name
  • String getName():返回此线程的名称
  • 通过构造方法也可以设置线程名称

currentThread()
返回对当前正在执行的线程对象的引用。

获取main方法所在线程名称

1
System.out.println(Thread.currentThread().getName()); //main

1.5 线程调度

线程有两种调度模式

  • 分时调度模型:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
  • **抢占式调度模型:优先让优先级高的线程使用CPU,如果优先级相同,会随机选择,优先级高的线程获取的CPU时间片相对多一些

Java使用抢占式调度模式

假如计算机只有一个CPU,那么CPU在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才能执行指令。所以说多线程程序的执行是有随机性的。

如何自己设置优先级

Thread类中设置和获取线程优先级的方法

  • public final int getPriority():返回此线程的优先级
  • public final void setPriority(int newPriority):更改此线程的优先级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package yolin;

public class demo1 {
public static void main(String[] args) {
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.setName("florence");
mt2.setName("yolin");
mt3.setName("db");
// System.out.println(mt1.getPriority());//5 默认值
// System.out.println(mt2.getPriority());//5
// System.out.println(mt3.getPriority());//5
System.out.println(Thread.MAX_PRIORITY);//最大值10
System.out.println(Thread.MIN_PRIORITY);//最小值1
System.out.println(Thread.NORM_PRIORITY);//默认5

mt1.setPriority(5);
mt2.setPriority(10);
mt3.setPriority(1);

mt1.start();
mt2.start();
mt3.start();
}
}

线程优先级高仅仅表示线程获取的CPU时间片的几率高,但是要在次数比较多,或多次运行的时候才能看到想要的效果

1.6 线程控制

方法名 说明
static void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join() 等待这个线程死亡
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出



1.7 线程生命周期

1.8 多线程的实现方式

方式2:实现Runnable接口

  • 定义一个类Runnable_实现Runnable接口
  • 在Runnable_类中重写run()方法
  • 创建Runnable_类的对象
  • 创建Thread类的对象,把Runnable_对象作为构造方法的参数
  • 启动线程

多线程的实现方案有两种

  • 继承Thread类
  • 实现Runnable接口

相比继承Thread类,实现Runnable接口的好处

  • 避免了Java单继承的局限性
  • 适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据邮箱分离,较好的体现了面向对象的设计思想

请我喝杯咖啡吧~

支付宝
微信