多线程通信【生产消费案例】
2017-07-20 21:02
281 查看
介绍:
在多线程环境下,虽然,我们能够让两个线程安全的隔离的执行锁范围内所包含的代码块,但是还有个问题就是一个线程会在一个时间段类执行代码块很多次,但是我们的需求是让一个线程锁范围所包含的代码块在抢到CPU执行片后只执行一次,我们该怎么实现呢???等待和激活。
那么在这种情况下,就非常需要两个东西了:等待和激活。notify(); wait(); 注意:在wait()后,再次通过notify()激活线程时,该线程的执行还是从wait()后第一行开始执行。 你知道wait()和sleep()方法的区别吗?? 答:wait()会释放锁,而sleep()不会释放锁。
资源类:
/** * Created by FireLang on 2017-07-20. */ public class Student { private String mName; private Integer mAge; private boolean mIsEat = false; public String getName() { return mName; } public boolean isEat() { return mIsEat; } public void setEat(boolean eat) { mIsEat = eat; } public void setName(String name) { mName = name; } public Integer getAge() { return mAge; } public void setAge(Integer age) { mAge = age; } }
生产者:
/** * Created by FireLang on 2017-07-20. */ public class SetStudent implements Runnable { private Student mStudent; private int mNum = 0; public SetStudent(Student student) { mStudent = student; } @Override public void run() { while (true) { synchronized (mStudent) { if (mStudent.isEat()) { try { mStudent.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } if (mNum % 2 == 0) { mStudent.setName("Joy"); mStudent.setAge(18); } else { mStudent.setName("FireLang"); mStudent.setAge(19); } mNum++; mStudent.setEat(true); mStudent.notify(); } } } }
消费者:
/** * Created by FireLang on 2017-07-20. */ public class GetStudent implements Runnable { private Student mStudent; public GetStudent(Student student) { mStudent = student; } @Override public void run() { while (true) { synchronized (mStudent) { if (!mStudent.isEat()) { try { mStudent.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(mStudent.getName() + "--->" + mStudent.getAge()); mStudent.setEat(false); mStudent.notify(); } } } }
测试类:
/** * Created by FireLang on 2017-07-20. */ public class StudentDemo { public static void main(String[] args) { Student student = new Student(); GetStudent getStudent = new GetStudent(student); SetStudent setStudent = new SetStudent(student); Thread t1 = new Thread(getStudent); Thread t2 = new Thread(setStudent); t1.start(); t2.start(); } }
最后的输出就是,你一次,我一次,你一次,我一次。
下面就涉及到线程的执行状况了。
线程的状态转换图及常见执行情况
相关文章推荐
- 多线程的经典案例(生产消费问题)
- Java 多线程间通信 多生产 多消费问题
- 多线程经典问题:馒头问题 生产和消费问题(线程的通信问题)
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程之生产消费
- 【代码练习6】利用多线程生产消费问题实现熊吃蜂蜜问题
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
- 编写一个多线程程序,模拟2个生产者生产产品,3个消费者消费产品。2个生产者不停的生产商品3个消费者不停的消费产品。
- 《黑马程序员》java笔记->生产消费多线程,同步代码块(优化代码)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- JavaSE 多线程 线程间通信 生产者与消费者案例
- 并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法 在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。
- 使用Condition实现多线程之间调用(生产消费模式)
- 编写一个多线程程序,模拟2个生产者生产产品,3个消费者消费产品。2个生产者不停的生产商品3个消费者不停的消费产品。
- 这个是以前以前写的一个通过生产消费模式反应线程同步的一个案例
- python多线程生产消费
- 多线程中的多生产多消费问题
- 使用Lock锁机制实现 多线程的 多生产 多消费 模式。