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

目录
相关文章
|
5天前
|
编解码 网络协议 API
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
Netty运行原理问题之Netty的主次Reactor多线程模型工作的问题如何解决
|
1天前
|
Java
java开启线程的四种方法
这篇文章介绍了Java中开启线程的四种方法,包括继承Thread类、实现Runnable接口、实现Callable接口和创建线程池,每种方法都提供了代码实现和测试结果。
java开启线程的四种方法
|
4天前
|
存储 缓存 安全
深度剖析Java HashMap:源码分析、线程安全与最佳实践
深度剖析Java HashMap:源码分析、线程安全与最佳实践
|
5天前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
13 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
|
4天前
|
算法 安全 Java
深入解析Java多线程:源码级别的分析与实践
深入解析Java多线程:源码级别的分析与实践
|
4天前
|
存储 Kubernetes NoSQL
Tair的发展问题之Tair在适配不同的存储介质时对于线程模型该如何选择
Tair的发展问题之Tair在适配不同的存储介质时对于线程模型该如何选择
|
5天前
|
Java 程序员 调度
深入浅出Java多线程编程
Java作为一门成熟的编程语言,在多线程编程方面提供了丰富的支持。本文将通过浅显易懂的语言和实例,带领读者了解Java多线程的基本概念、创建方法以及常见同步工具的使用,旨在帮助初学者快速入门并掌握Java多线程编程的基础知识。
4 0
|
5天前
|
Java
java中获取当前执行线程的名称
这篇文章介绍了两种在Java中获取当前执行线程名称的方法:使用`Thread`类的`getName`方法直接获取本线程的名称,以及使用`Thread.currentThread()`方法获取当前执行对象的引用再调用`getName`方法。
|
8天前
|
安全 Java 数据处理
Java并发编程:解锁多线程的潜力
在数字化时代的浪潮中,Java作为一门广泛使用的编程语言,其并发编程能力是提升应用性能和响应速度的关键。本文将带你深入理解Java并发编程的核心概念,探索如何通过多线程技术有效利用计算资源,并实现高效的数据处理。我们将从基础出发,逐步揭开高效并发编程的面纱,让你的程序运行得更快、更稳、更强。
|
7天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
28 7