0015-多线程-生产消费模式
2018-02-09 01:07
232 查看
生产消费模式* 生产者生产包子
* 先看是否有包子,没有就生产,有就等待并通知消费者来消费包子
* 消费者消费包子
* 先看是否有包子,有就消费,没有就等待并通知生产者来生产包子
* java提供了等待唤醒机制等待唤醒机制* Object类提供了等待方法和唤醒方法
* 等待
* wait():进入等待并立即释放锁,等待期间该线程抢不到cpu执行权
* 唤醒
* notify():唤醒绑定在该锁上的单个等待的线程,重新抢cpu执行权
* notifyAll():唤醒绑定在该锁上的所有等待的线程,重新抢cpu执行权
* 这些方法必须使用锁对象调用,所以定义在Object类中等待唤醒机制代码
public class Student {
private String name;
private int age;
private boolean flag;
public synchronized void set(String name, int age) {
if(this.flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产
this.name = name;
this.age = age;
// 修改标记
this.flag = true;
this.notify();
}
public synchronized void get(){
if(!this.flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 消费
System.out.println(this.name+"---"+this.age);
// 修改标记
this.flag=false;
this.notify();
}
}
SetThread类
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
s.get();
}
}
}MyTest package pack;
public class MyTest {
public static void main(String[] args) {
Student s = new Student();
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
t1.start();
t2.start();
}
}
* 先看是否有包子,没有就生产,有就等待并通知消费者来消费包子
* 消费者消费包子
* 先看是否有包子,有就消费,没有就等待并通知生产者来生产包子
* java提供了等待唤醒机制等待唤醒机制* Object类提供了等待方法和唤醒方法
* 等待
* wait():进入等待并立即释放锁,等待期间该线程抢不到cpu执行权
* 唤醒
* notify():唤醒绑定在该锁上的单个等待的线程,重新抢cpu执行权
* notifyAll():唤醒绑定在该锁上的所有等待的线程,重新抢cpu执行权
* 这些方法必须使用锁对象调用,所以定义在Object类中等待唤醒机制代码
* Student类 * SetThread类:生产者 * GetThread类:消费者 * MyTest类:测试类Student类package pack;
public class Student {
private String name;
private int age;
private boolean flag;
public synchronized void set(String name, int age) {
if(this.flag) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 生产
this.name = name;
this.age = age;
// 修改标记
this.flag = true;
this.notify();
}
public synchronized void get(){
if(!this.flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 消费
System.out.println(this.name+"---"+this.age);
// 修改标记
this.flag=false;
this.notify();
}
}
SetThread类
package pack; public class SetThread implements Runnable { private Student s; private int x = 0; public SetThread(Student s) { this.s = s; } @Override public void run() { while (true) { if (x % 2 == 0) { s.set("刘亦菲", 25); } else { s.set("范守俊", 28); } x++; } } }GetThread类package pack;
public class GetThread implements Runnable {
private Student s;
public GetThread(Student s) {
this.s = s;
}
@Override
public void run() {
while (true) {
s.get();
}
}
}MyTest package pack;
public class MyTest {
public static void main(String[] args) {
Student s = new Student();
SetThread st = new SetThread(s);
GetThread gt = new GetThread(s);
Thread t1 = new Thread(st);
Thread t2 = new Thread(gt);
t1.start();
t2.start();
}
}
相关文章推荐
- java多线程之生产消费模式
- 使用Lock锁机制实现 多线程的 多生产 多消费 模式。
- 使用Condition实现多线程之间调用(生产消费模式)
- Java多线程实例->生产消费模式
- 基于redis的多线程生产消费模式
- Java 多线程拷贝文件夹并调用tinyPng算法接口压缩图片实现(生产消费变种)
- 生产消费模式
- 多线程中的多生产多消费问题
- 使用C#的泛型队列Queue实现生产消费模式
- 简单生产消费模式的代码流程(Java代码)
- 【我的Java笔记】多线程_等待唤醒机制(生产消费者模式)
- 生产消费模式
- 多线程等待唤醒机制之生产消费者模式
- python并行任务之生产消费模式
- 线程的简单生产消费模式
- java多线程之生产消费问题
- JAVA生产消费模式(代码及流程图)
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- Java多线程如何才能协调好生产和消费的关系
- redis队列-生产消费模式-简单实现