Java----实现多线程(初识)
进程:正在运行的程序
- 是系统进行分配和调用资源的独立单位
- 每一个进程都有他自己的内存空间和系统资源
线程:是进程中的单个顺序控制流,是一条执行路径
- 一个线程如果只有一条执行路径,那就称为单线程:记事本程序
- 一个线程如果有多条执行路径,那就称为多线程:扫雷程序
多线程的实现方式:
方式一:继承Thread类
- 定义一个MyThread继承Thread类
- 在MyThread类中重写run()方法
- 创建MyThread类的对象
- 启动线程
两个小问题:
- 为什么要重写run()方法呢?
因为run()方法是用来封装被线程执行的代码
-
run()方法与start()方法的区别:
run():封装线程执行的代码,直接调用,相当于普通方法的调用
start():启动线程,然后由JVM(Java虚拟机)调用次线程的run()方法
代码实现:
public static void main(String[] args) {
ThreadDemo01 td = new ThreadDemo01();
ThreadDemo01 td2 = new ThreadDemo01();
// td.run();
// td2.run();
td.start();
td2.start();
}
设置和获取多线程名称
方法一:Thread类中设置和获取多线程名称的方法:
- void setName(String name):为此线程设置名称
- String getName():返回此线程的名称
方法二:使用带参构造方法
- 在自创的继承了Thread类的Java文件中写一个无参构造方法
- 接着写一个带参构造方法(利用super()方法)
- 直接在创建对象时命名
代码:
public static void main(String[] args) {
ThreadDemo01 td = new ThreadDemo01("一号机");
ThreadDemo01 td2 = new ThreadDemo01("二号机");
// td.setName("火车");
// td2.setName("飞机");
td.start();
td2.start();
}
方法三:利用Thread类中的静态方法
- 利用静态方法::static Thread currentThread()返回对当前正在执行的线程对象的引用
- 直接在输出时使用此方法
代码:
public static void main(String[] args) {
ThreadDemo01 td = new ThreadDemo01();
ThreadDemo01 td2 = new ThreadDemo01();
// td.setName("火车");
// td2.setName("飞机");
// td.start();
// td2.start();
System.out.println(Thread.currentThread().getName());
}
线程调度
线程有两种调度模型:
- 分时调度模型:所有线程轮流使用cpu的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级高的线程先执行,若优先级相同,则随机选择一个执行
Java中线程执行默认是第二个模型
抢占式调度模型的两个方法:
-
public final int getPriority()返回此线程的优先级
-
public final int setPriority()设置该线程的优先级
-
注意:优先级高并不代表他一定先执行,只能说他占有的CPU时间片多
线程优先级默认是5,最高是10,最低是1。
代码:
public static void main(String[] args) {
MyThread01 mt1 = new MyThread01("火车");
MyThread01 mt2 = new MyThread01("飞机");
MyThread01 mt3 = new MyThread01("汽车");
System.out.println(mt2.getPriority());
mt1.setPriority(5);
mt2.setPriority(10);
mt3.setPriority(1);
mt1.start();
mt2.start();
mt3.start();
}
线程控制
方法名 | 说明 |
---|---|
static void sleep(long millis) | 使当前正在执行的线程暂停执行指定的毫秒数 |
void join() | 等待这个线程死亡(先让该线程执行完) |
void setDaemon(boolean) | 将这个线程标为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出(也就是说没有设置成守护线程的运行完后,被设置为守护线程的线程将停止运行) |
线程的生命周期
多线程的实现方式 (二)
实现Runnable接口
- 创建一个MyRunable实现Runnable接口
- 在MyRunnable中重写run()方法
- 创建 MyRunnable类的对象
- 创建Thread类的对象,把MyRunnable对象作为构造方法的参数
- 启动线程
代码实现:
public static void main(String[] args) {
MyRunable mr = new MyRunable();
Thread t1 = new Thread(mr,"高铁");
Thread t2 = new Thread(mr,"汽车");
t1.start();
t2.start();
}
多线程的实现方式有两种:
- 继承Thread类
- 实现Runable接口
相比继承Thread类,实现Runnable接口的好处:
- 避免了java的单继承局限性
- 适合多个相同程序的代码去处理同一个资源的情况,把线程、程序的代码和数据有效分离,较好的体现了面向对象的设计思想