123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- Java23种设计模式------生产者消费者模式
- 生产者消费者模式是个非常经典的多线程协作的设计模式,
- 生产者消费者模式实际上是包含两类线程:
- 一类是生产者,用来生产数据
- 一类是消费者,用来消费数据
- 为了解耦生产者和消费者之间的关系,一般会采用共享的数据区域,就像一个仓库。
- 生产者生产数据之后,直接放置在共享数据区域种,不需要关心消费者的行为。
- 消费者只需要从共享区域种获取数据就可以了,不需要关心生产者的行为。
- Object类提供等待线程和唤醒线程的方法:
- void wait() 导致当前的线程等待,不限时等待。直到另一个线程调用了该对象的notify()方法或notifyAll()方法
- void notify() 唤醒正在等待【对象监视器】(锁)的单个线程
- void notifyAll()唤醒等待的所有线程
- 案例:
- 桌子类(Desk):定义表示包子数量的变量,定义锁对象变量,定义标记桌子上有无包子的变量
- 生产者类(Cooker):实现Runnable接口,重写run()方法,设置线程任务
- 1.判断是否有包子,决定当前线程是否执行
- 2.如果有包子,就进入等待状态,如果没有包子,继续执行,生产包子
- 3.生产包子之后,更新桌子上包子状态,唤醒消费者消费包子
- 消费者类(Foodie):实现Runnable接口,重写run()方法,设置线程任务
- 1.判断是否有包子,决定当前线程是否执行
- 2.如果没有包子,就进入等待状态,如果有包子,就消费包子
- 3.消费包子后,更新桌子上包子状态,唤醒生产者生产包子
- 测试类(Demo):里面有main方法,main方法中的代码步骤如下
- 创建生产者线程和消费者线程对象
- 分别开启两个线程
- 一直使用线程成本比较高,频繁的创建和销毁线程成本比较高?
- 线程的状态:
- 线程创建并启动后,并不是一启动就进入到执行状态,也不是一直处在等待或执行状态。
- 线程对象在不同的时期有不同的状态,那么Java线程到底存在几种状态?
- 根据Java提供的线程类Thread的内部枚举类提供的状态划分:
- 1、NEW 新建状态
- |-也叫初始状态,开始状态,就是线程刚被的创建,但是没有被启动,还没有调用start方法,
- 类似 Thread t=new Thread() 的情况,但是t只是线程对象,不具备线程特征
- 2、RUNNABLE 就绪状态 可运行状态
- |-当我们调用了start方法,那么此时线程对象进入到了RUNNABLE状态,才是真正的在JVM进程种创建了一个线程。
- 线程一启动并不是立刻就能够执行的,它暂时没有执行权,线程能不能允许,要听CPU的调度。我们把这个中间状态(新建和运行的中间状态)称为可执行状态。
- 也就是说当前这个线程具备了可以执行的资格,但是没有真正的执行起来,需要等CPU调度。
- 3、BLOCKED 阻塞状态
- |-当一个线程想要获取一个对象锁,但是这个对象锁被其他线程持有,那么当前线程就进入到了BLOCKED状态也就是阻塞状态。
- 假如当前线程获取到了对象锁,那么它会重新进入到RUNNABLE状态。
- 4、WAITING 无限时等待
- |-一个正在等待的线程状态,就是所谓的等待状态,造成等待状态的原因有两个:
- 1、调用了Object类的wait()方法。
- 2、调用了Thread类的join()方法。
- 处在等待状态的线程,会等待其他线程执行一个特定的操作,
- 比如A线程是由于wait方法,导致的等待,它就需要等其他线程调用notify或notifyAll方法才能被唤醒
- 比如B线程是由于join()方法导致的等待,那么它就需要等待其他线程结束,才会恢复。
- 5、TIMED_WAITING 计时等待
- |-在一个限定的时间内等待的线程状态,也叫限时等待状态。造成限时等待的状态的方式有三种:
- 1、Thread.sleep(long ms) 睡眠
- 2、Object.wait(long ms) 等待
- 3、Thread.join(long ms) 等待
- 6、TERMINATED 终止
- |-是一个完全运行完成的线程的状态,所以叫终止状态,结束状态。
- 我们可以通过Thread的getState()方法来获取线程当前的状态
- 操作系统--线程的5种状态
- 1、新建
- 2、就绪
- 3、运行
- 4、阻塞
- 5、终止
- Java的线程6种状态:
- 1、新建
- 2、可运行
- 3、无限时等待
- 4、计时等待
- 5、阻塞
- 6、终止
|