Java笔记之线程消费者模型

简介: 1.通过这个模型 成功的演示出了 线程安全的问题 两个消费者 同时访问同一个仓库对象 仓库内只有一个元素的时候 两个消费者并发访问 会有可能产生抢夺资源的问题 2.自己解决一下线程安全的问题 让仓库对象被线程访问的时候 仓库对象被锁定 仓库对象只能被一个线程访问 其他的线程处于等待状态 特征修饰符 synchronized 同步 一个时间点只有一个线程访问 线程安全锁 两种形式写法 1.将synchronized关键字 放在方法的结构上 public synchronized void get(){} 锁定的是调用

知识回顾

1.三个非常重要的概念

  程序---->   一组写好了的静态的代码

  进程---->   正在进行着的程序   静态的代码执行起来啦

  线程---->   是进程内的小单元   很多线程同时执行

2.需要掌握线程的几种不同的状态  及如何切换

   new对象           start()       CPU分配run()    wait()        exception  

  创建线程(对象)----就绪状态----执行状态----等待/挂起----异常/消亡

     |                                    |

     |__________________________|

            notify/notifyAll

3.如何实现线程

   自定义一个类

   继承Thread    实现Runnable

   重写run方法

   调用start方法  让线程进入就绪状态  需要注意的是start方法Thread类中

购票的小例子

利用Vector集合   线程安全   多个线程并发操作同一个集合的时候  不会抢夺资源

 

生产消费者模型

1.通过这个模型  成功的演示出了  线程安全的问题

 两个消费者  同时访问同一个仓库对象   仓库内只有一个元素的时候

 两个消费者并发访问  会有可能产生抢夺资源的问题

2.自己解决一下线程安全的问题

 让仓库对象被线程访问的时候   仓库对象被锁定

 仓库对象只能被一个线程访问   其他的线程处于等待状态

 特征修饰符

 synchronized  同步  一个时间点只有一个线程访问

线程安全锁

 两种形式写法

 1.将synchronized关键字 放在方法的结构上

    public synchronized void get(){}

    锁定的是调用方法时的那个对象

 2.将synchronized关键字 方在方法(构造方法 块)的内部  

    public void get(){

  好多代码

  synchronized(对象){

   好多代码

  }

  好多代码

    }

3.我们觉得return不是很好

 应该让线程的不同状态来回切换

 执行   等待   执行   等待

 wait() Object类中的方法

 对象.wait();

 对象.wait(); 不是当前的这个对象wait

    访问当前这个对象的线程wait

 notify

 notifyAll

 p.setPriority(10);  p.getPriority();

 产生一个类似假死状态

 所有的线程都进入等待状态  没有线程做事

4.通过上述的生产消费者模型

做一个非常完整而且安全的模型

 1.利用线程安全锁    特征修饰符synchronized  

  两种不同的写法

  不管怎么写   锁定的永远是对象

 2.利用方法控制线程状态的来回切换

  wait

  notify notifyAll

  上述三个方法都是Object类中的方法

 3.Thread类中的方法

  sleep方法    静态方法(参数long 毫秒值)

  setPriority(10); getPriority();

  设置/获取线程的优先级  1-10  

  数字越高优先级越高   更加容易获取CPU分配的资源碎片

 4.笔试题

  程序 进程 线程 概念的区别

  线程的创建方式

线程的几种状态  如何切换

   sleep方法   wait方法的区别

  1.类 Thread类   Object类

  2.调用 静态 类名.   对象.

  3.理解 哪个位置调用   对象调用方法

   哪个线程等待   访问对象的其他线程等待

  4.唤醒 不需要别人      需要其他对象调用notify唤醒

  5.锁 不会释放锁      等待后会释放锁

 

5.join方法 Thread类中的方法

 让多个线程同步执行  变成单个线程

6.死锁

目录
相关文章
|
9天前
|
存储 监控 Java
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
121 60
【Java并发】【线程池】带你从0-1入门线程池
|
23天前
|
存储 缓存 关系型数据库
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
|
5天前
|
Java 调度
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
51 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
|
21天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
87 14
|
24天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
53 13
|
2月前
|
存储 Java 开发者
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
本文详细介绍了 Java 中 `toString()` 方法的重写技巧及其重要
57 10
【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
|
24天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
2月前
|
前端开发 JavaScript Java
Java构建工具-maven的复习笔记【适用于复习】
这篇文档由「潜意识Java」创作,主要介绍Maven的相关知识。内容涵盖Maven的基本概念、作用、项目导入步骤、依赖管理(包括依赖配置、代码示例、总结)、依赖传递、依赖范围以及依赖的生命周期等七个方面。作者擅长前端开发,秉持“得之坦然,失之淡然”的座右铭。期待您的点赞、关注和收藏,这将是作者持续创作的动力! [个人主页](https://blog.csdn.net/weixin_73355603?spm=1000.2115.3001.5343)
45 3
|
2月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
121 17