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.死锁

目录
相关文章
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
66 23
|
13天前
|
java 多线程异常处理
本文介绍了Java中ThreadGroup的异常处理机制,重点讲解UncaughtExceptionHandler的使用。通过示例代码展示了当线程的run()方法抛出未捕获异常时,JVM如何依次查找并调用线程的异常处理器、线程组的uncaughtException方法或默认异常处理器。文章还提供了具体代码和输出结果,帮助理解不同处理器的优先级与执行逻辑。
|
1月前
|
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
本文涉及InheritableThreadLocal和TTL,从源码的角度,分别分析它们是怎么实现父子线程传递的。建议先了解ThreadLocal。
72 4
【源码】【Java并发】从InheritableThreadLocal和TTL源码的角度来看父子线程传递
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
116 23
Redis的线程模型
Redis采用单线程模型确保操作的原子性,每次只执行一个操作,避免并发冲突。它通过MULTI/EXEC事务机制、Lua脚本和复合指令(如MSET、GETSET等)保证多个操作要么全成功,要么全失败,确保数据一致性。Redis事务在EXEC前失败则不执行任何操作,EXEC后失败不影响其他操作。Pipeline虽高效但不具备原子性,适合非热点时段的数据调整。Redis 7引入Function功能,支持函数复用,简化复杂业务逻辑。总结来说,Redis的单线程模型简单高效,适用于高并发场景,但仍需合理选择指令执行方式以发挥其性能优势。
77 6
|
2月前
|
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
185 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
Java初级笔记-第五章
第五章 面向对象的特点 5.1 继承 面向对象的重要特点之一就是继承。类的继承使得能够在已有的类的基础上构造新的类,新类除了具有被继承类的属性和方法外,还可以根据需要添加新的属性和方法。
1078 0
Java初级笔记-第一章
第一章 Java概览 1.1 基本简介 Java是一种理想的面向对象的网络编程语言。 1991年,出现了Oak语言,旨在解决编程语言的选择和跨平台的问题。
1402 0
Java初级笔记-第二章
第二章 Java的基本数据类型、运算符及表达式 2.1 标识符 标识符是程序员对程序中的各个元素加以命名时使用的命名记号。
1238 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等