生产者和消费者之等待唤醒机制
2017-04-17 16:10
169 查看
package test48; /*** * 多线程:生产者消费者问题代码 * * 分析: 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * * 问题:发现数据每次都是:null---0 * 原因:在每个线程中都创建了新的资源,而我们要求的时候设置和获取线程的资源应该是同一个 * 如何解决:在外界把这个数据创建出来,通过构造方法传递给其他的类。 * * 问题:为了数据的效果好些,就加入了循环和判断,给出不同的值,这个时候产生新问题 * A:同一个数据出现多次B:姓名和年龄不匹配 * * 原因: A:同一个数据出现多次 * CPU的一点点时间片的执行权,就足够你执行很多次。 * B:姓名和年龄不匹配 * 线程运行的随机性 * * 线程安全问题: * 是否是多线程环境 是 * 是否有共享数据 有 * 是否有多条语句操作 有 * * 解决方案:加锁 * A:不同种类的线程都要加锁 * B:不同种类的线程加的锁必须是同一把。 * * * 等待唤醒: * Object类中提供了三个方法: * wait():等待 * notify():唤醒单个线程 * notifyAll():唤醒所有线程 * 为什么这些方法不定义在Thread类中呢? * 这些方法的调用通过必须锁对象调用,而我们刚才使用的锁对象是任意锁对象。 * 所以这些方法必须定义在Object中。 */ public class StudentDemo { 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(); } } // 资源类 class Student { String name; int age; boolean flag;//默认是flase,是没有数据。如果是true,代表有数据。 } class SetThread implements Runnable { private Student s; private int x = 0; public SetThread(Student s) { this.s = s; } @Override public void run() { // TODO Auto-generated method stub while (true) { synchronized (s) { //判断有没有数据 if(s.flag) { try { s.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (x % 2 == 0) { s.name = "白"; s.age = 32; } else { s.name = "小黑"; s.age = 90; } x++; //有就修改标记,并唤醒 s.flag=true; s.notify(); } } } } class GetThread implements Runnable { private Student s; public GetThread(Student s) { this.s = s; } @Override public void run() { // TODO Auto-generated method stub while (true) { synchronized (s) { if(!s.flag) { try { s.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(s.name + "---" + s.age); //有就消费,然后修改标记,并唤醒线程 s.flag=false; s.notify(); } } } }
相关文章推荐
- 多线程 等待唤醒机制 生产者消费者 (Lock jdk1.5版)
- java多线程中的等待唤醒机制--多生产者多消费者问题
- Java多线程生产者消费者说明等待唤醒机制问题和虚假唤醒问题
- 24 API-多线程(多线程(多线程JDK5Lock锁,生产者消费者等待唤醒机制,定时器),设计模式(设计原则,设计模式(简单工程,工厂方法,单例模式)
- java 分别利用synchronized和jdk1.5新特性实现多消费者-多生产者线程的等待唤醒机制
- 多线程-等待唤醒机制经典案例-生产者消费者
- java多线程中的生产者与消费者之等待唤醒机制@Version1.0
- 线程间通信:生产者消费者(等待唤醒机制)
- 多线程_生产者消费者之等待唤醒机制思路图解
- 多线程_生产者消费者之等待唤醒机制代码实现
- java多线程中的生产者与消费者之等待唤醒机制@Version2.0
- 多线程-生产者消费者之等待唤醒机制
- 多线程_生产者消费者之等待唤醒机制代码分析
- 多线程-生产者消费者之等待唤醒机制代码优化
- day12线程间的通信,等待唤醒机制,生产者消费者问题。新锁lock(): 守护线程,interrupt()停止线程用,join()yield()
- 线程的等待唤醒机制(生产者消费者代码)
- 多线程_生产者消费者之等待唤醒机制代码优化
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- 通过生产者消费者案例理解等待唤醒机制和虚假唤醒
- 生产者消费者:等待唤醒机制(最终版代码)