![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java 多线程
文章平均质量分 54
根据B站UP主“遇见狂神说”的多线程课程所做笔记
lhlyzh
努力奋进中的小白
展开
-
十、生产者消费者问题
一、生产者消费者问题1. 问题假设仓库中只能放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中的产品取走消费如果仓库中没有产品,则生产者将产品放入仓库。否则停止生产并等待,直到仓库中的产品被消费者取走为止如果仓库中放有产品,则消费者可以将产品取走消费,否则停止消费并等待,直到仓库中再次放入产品为止2. 分析生产者和消费者共享同一个资源,并且两者之间相互依赖,互为条件对于生产者,没有生产产品之前要通知消费者等待。而生产了产品之后又需要立即通知消费者对于消费者,在消费之后要通知生产原创 2021-08-02 16:49:03 · 789 阅读 · 0 评论 -
九、Lock 锁
Lock 锁1. 概要从 JDK5 开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用 Lock 对象充当java.util.concurrent.locks.Lock接口是控制多个线程对共享资源访问的工具锁提供了对共享资源的独占访问,每次只能有一个线程对 Lock 对象加锁,线程开始访问共享资源前须先获得 Lock 对象ReentrantLock类(可重入锁)实现了 Lock ,它拥有与synchronized相同的并发性和内存语义在实现线程安全的控制中原创 2021-08-02 16:46:45 · 53 阅读 · 0 评论 -
八、死锁
一、死锁1. 原因 多个线程同时被阻塞,其中一个或全部都在等待某个资源被释放。由于线程被无限期的阻塞,因此程序无法正常终止。如图线程A占有资源1,线程B占有资源2,双方同时申请对方的资源,就会互相等待而进入死锁状态。例:public class DeadLock { public static void main(String[] args) { Makeup girl1 = new Makeup(0, "第一个女孩"); Makeup girl2 =原创 2021-08-02 16:45:39 · 48 阅读 · 0 评论 -
七、线程同步
一、并发与并行并发:同一时间段内,多个任务都在执行。CPU可以把执行时间分成若干份,每个线程执行一段时间后记录当前工作状态并行:单位时间内多个任务同时执行二、线程同步注:锁的对象一定要是属性有增删改的对象!!!所谓线程同步并不是使线程同时执行,而是将线程排队!!!1. 形成条件:队列 + 锁为保证数据在方法中被访问时的正确性,在访问时加入锁机制synchronized, 当一个线程获得对象的排它锁独占资源时,其它线程必须等待。使用后释放锁即可。会产生以下问题:一个线程持有锁会导原创 2021-08-02 16:43:37 · 43 阅读 · 0 评论 -
六、守护线程
守护(Daemon)线程线程分为用户线程和守护线程虚拟机必须确保用户线程执行完毕虚拟机不必等待守护线程执行完毕使用setDaemon()方法将线程设置为守护线程(默认为用户线程)守护线程的默认优先级比较低如:后台日志、监控内存、垃圾回收等等例:public class TestDaemon { public static void main(String[] args) { God god = new God(); You you = new Yo原创 2021-08-02 16:42:13 · 40 阅读 · 0 评论 -
五、线程优先级
一、线程优先级Java 提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度哪个线程来执行线程优先级用数字标识,范围从1~10Thread.MIN_PRIORITY = 1;Thread.MAX_PRIORITY = 10;Thread.NORM_PRIORITY = 5;使用以下方法获取或改变优先级getPriority()setPriority(<整数>)CPU调度会考虑优先级,但只是提高优先调度的权重,并不一定会先执行原创 2021-08-02 16:41:40 · 57 阅读 · 0 评论 -
四、线程状态
一、线程状态操作系统中,线程被视为轻量级的进程,因此操作系统的线程状态与操作系统的进程状态是一致的1. 线程五大状态创建状态Thread t = new Thread() 线程对象一旦创建就进入到了新生状态就绪状态当调用start() 方法,线程会进入就绪状态,但不意味着立即执行运行状态进入运行状态,线程才会真正去执行线程体的代码阻塞状态当调用sleep()、wait()或同步锁定时,线程进入阻塞状态,代码不会继续执行。等待阻塞事件解除后,重新进入就绪状态,等待CPU调度原创 2021-08-02 16:41:02 · 250 阅读 · 0 评论 -
三、静态代理模式
静态代理模式 静态代理是多线程底部的原理,在 Java 中线程的设计就使用了静态代理设计模式,其中自定义线程类及Thread类都是实现了Runnable接口。 在创建子线程的时候,传入了自定义线程类的引用,再通过调用start()方法,调用自定义线程对象的run()方法。实现了线程的并发执行。概要真实对象和代理对象都要实现同一个接口代理对象要代理真实角色真实对象只专注于自己的功能,代理对象可以帮忙做其他的事步骤定义抽象接口定义真实对象的类定义代理对象的类通过代理对象调用实原创 2021-08-02 16:38:22 · 41 阅读 · 0 评论 -
二、线程的创建
一、创建方式线程的创建有三种方式:继承Thread类实现Runnable接口实现Callable接口注:线程开启不一定立即执行,由CPU调度决定1. 继承Thread类继承Thread类创建线程可分为以下几步:自定义线程类继承Thread类重写run() 方法,编写线程执行体创建线程对象,调用start()方法启动线程例:public class TestThread extends Thread { @Override public void run()原创 2021-08-02 16:37:20 · 272 阅读 · 0 评论 -
一、进程与线程
一、进程和线程的定义1. 进程进程是执行程序的一次从创建到消亡的过程。程序本身只是指令和数据的有序集合,是一个静态概念。而进程是一个动态的概念,是系统资源分配的单位。注:一个进程只能对应一个程序,而一个程序可以对应多个进程2. 线程线程是一个比进程更小的执行单位,一个进程在执行过程中可以产生多个线程,当然也至少会存在一个线程,否则进程就没有存在的意义。线程是CPU调度和执行的单位。注:真正的多线程是指有多个CPU,即多核。很多多线程是模拟出来的,即在一个CPU的情况下,在同一个时间点,CP原创 2021-08-02 16:35:27 · 80 阅读 · 0 评论