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

目录
相关文章
|
1天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
1天前
|
安全 Java 开发者
Java中的多线程编程:从基础到实践
本文深入探讨了Java多线程编程的核心概念和实践技巧,旨在帮助读者理解多线程的工作原理,掌握线程的创建、管理和同步机制。通过具体示例和最佳实践,本文展示了如何在Java应用中有效地利用多线程技术,提高程序性能和响应速度。
16 1
|
9天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
9天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
8天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
48 1
C++ 多线程之初识多线程
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
30 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
34 1
下一篇
无影云桌面