多线程

Java SE

本系列为本人学习情况记录,部分资料来自老师课件或书籍摘录。


一、多线程的基本概念及创建线程

1.1 基本概念

1.1.1 程序

是一个指令码文件,描述需要系统完成的一件事情

1.1.2 进程

进程是指一种正在运行的程序,有独立的内存空间和系统资源

1.1.3 线程

是进程中最小的一个执行单位,可以从头至尾的完成任务执行流程

1.1.4 多线程、并发

如果在一个进程中总同时运行多个线程完成工作,则是多线程即并发

1.1.5 主线程

Java 程序默认启动的线程,由虚拟机创建线程的入口是 main 方法

1.1.6 子线程

由主线程启动起来的线程则是子线程

1.2 创建线程

在这里插入图片描述

1.2.1 方式
  • 实现Runnable接口
  • 接口Thread类
1.2.2 步骤

实现 Runnable 接口方式

class Task implements Runnable{
	@Override
	public void run(){
		任务
	}
}
public class Main{
	public static void main(String[] args){
		new Thread(new Task()).start();
	}
}

这种方式我们称之为定义一个任务,再将这个任务分配给某个线程来执行
这种方式的好处是实现了线程与任务的分离,更加灵活,而且避免了只能单一继承的局限性
继承 Thread 类方式

class NewThread extends Thread{
	@Override
	public void run(){
		线程运行内容
	}
}
public class Main{
	public static void main(String[] args){
		//注:开启进程使用 start() 方法,而不是 run() 方法
		//run() 方法由虚拟机自动调用
		//这里是一个模板模式
		new NewThread().start;
	}
}

这种方式是我们直接定义了一个线程类来做某一件事情

二、线程的声明周期

2.1 线程主要包含五个状态

新生:创建对象
就绪:准备执行
运行:正在执行任务
阻塞:正在运行的程序因为某种原因进入阻塞状态,等待发生事件回到就绪状态
死亡:执行结束

在这里插入图片描述
线程强制执行

public class Main{
	public static void main(String[] args) throws InterruptedException {
		new Thread().join();
		System.out.println("子程序结束");
	}
}

这里主程序会等待匿名子程序执行完毕后再进行后续操作

为线程设置优先级
在这里插入图片描述

注:Linux系统会无视Java线程设置的优先级!!!!!

线程休眠
在这里插入图片描述
线程的 "礼让"
在这里插入图片描述

yield 和 sleep的异同

  1. yield、sleep 都能暂停当前线程,sleep 可以指定具体休眠时间,而 yield 则依赖 CPU 的时间片划分
  2. yield、sleep 两个在暂停过程中,如已经持有锁,则都不会释放锁资源
  3. yield 不能被中断,而 sleep 则可以接受中断

三、线程间的同步

4.1 线程安全(synchronized),同步锁,安全锁

说明

当多个线程对象调用同一个对象的方法时,同一时刻只能有一个线程可以使用资源,其他线程需要等待当前线程将对象资源释放之后才可以继续使用

可以用来修饰一个代码块,也可以用于修饰一个方法。在修饰代码块的时候需要指定当前要锁定的对象,即资源。当修饰方法的时候当前锁定的对象为this,即调用方法的对象。如果用于修饰静态方法,锁定的资源是当前类型。

4.2 【了解】死锁

4.2.1 什么是死锁

死锁即有两个或者以上的线程自己占用一部分其他线程需要使用的资源,而且在等待其他占用资源的线程释放资源给自己,形成的一种相互等待的状态。

死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程

五、生产者与消费者模型

5.1 等待(wait)与唤醒(notify)

5.1.1 说明

wait()与notify()都是Object对象上的方法

wait()与notify() 都必须放在线程的synchronize块中

notify()是随机唤醒一个在当前对象上等待的线程

notifyAll() 是唤醒在当前对象上等待的所有线程

5.2.2 生产者消费者模式

生产者专注于生产资源,消费者专注于消费资源;通常情况下,生产者将资源生产完毕之后就开始等待并通知消费者消费资源,消费者开始消费资源,当消费者将资源消费完毕之后开始等待并通知生产者生产资源。

六、线程池

线程池是管理并发执行多个任务的理想方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值