黑马程序员-关于生产者消费者和火车票出售的线程问题
2015-06-05 20:52
567 查看
------------------------------------------Android培训
Java培训 期待与您的交流!-------------------------------
Java培训 期待与您的交流!-------------------------------
/* 以车站售票为例说明资源共享问题,两个售票窗口同时 出售一次列车的车票,车票就是共享资源,两个窗口就 是两个线程。 对象锁控制共享数据 同步对象,同步方法,都可以实现对象锁 */ //模拟售票功能的线程类 public class WinThread extends Thread{ //继承Thread的线程类 Tickets tk=null; //记录售票数量 int n=0; public WinThread(Tickets tickets,String name){ //构造方法 super(name); this.tk=tickets; } public void run(){ while(true){ if(tk.getAmount()>0){ tk.saleone(); n=n+1; //记录售票数量 System.out.println(getName()+":"+n); try { Thread.sleep(50); } catch (InterruptedException e) { // TODO: handle exception } }else{ System.out.println(getName()+":已无票"); break; } } } } //票对象的类 public class Tickets { private int amount=100; //车票总数100,共享资源 public synchronized int getAmount(){ return amount; } public synchronized void saleone(){ //买票方法 amount=amount-1; } } //售票系统 public class TicketTS { public static void main(String args []){ Tickets tick=new Tickets(); Thread t1=new WinThread(tick, "1号售票员"); Thread t2=new WinThread(tick, "2号售票员"); t1.start(); t2.start(); } } /* 生产者-消费者 很多时候,不仅要防止共享资源的冲突问题,还是保证线程的同步 需求: 有一个生产者producer,一个消费者consumer。生产者产生 0~9的整数,将他存储在盒子BOX中。同时要求生产者产生一个数字, 消费者消费一个数字,对于共享的box,涉及到线程同步问题。 银行的存取款类似 */ public class Box { private int data; private boolean available=false; //表示数据的是否可用(产生数据) public synchronized void put(int value){ while(available==true){ //结果为true时,说明已产生了数据,所以进入等待 try { wait(); //线程进入等待状态 } catch (InterruptedException e) {} } //当跳出循环时,available为false,box无数据 data=value; //产生数据 available=true; //修改状态 notifyAll(); //唤醒其他线程 } public synchronized int get(){ while(available==false){ //当available为false,box无数据 try { wait(); } catch (InterruptedException e) {} } //跳出循环后,进行取出数据操作 available=false; notifyAll(); return data; // 取出BOX里面的数据 } } public class Consumer extends Thread{ private Box b; //被共享的对象 public Consumer(Box c){ b=c; } public void run(){ int value=0; for (int i = 0; i < 10;i++) { value=b.get(); //从共享资源b取出资源 System.out.println("Consumer "+"got:"+value); } } } public class PCT { public static void main(String args []){ Box c=new Box(); Producer p1=new Producer(c); Consumer c1=new Consumer(c); p1.start(); c1.start(); } } public class Producer extends Thread{ private Box b; 4000 0; //被共享的对象 public Producer(Box c){ b=c; } public void run(){ for (int i = 0; i < 10; i++) { b.put(i); System.out.println("Producer "+"put:"+i); try { sleep((int)(Math.random()*100)); } catch (InterruptedException e) { // TODO: handle exception } } } }
相关文章推荐
- C#线程间不能调用剪切板的解决方法
- C#线程同步的三类情景分析
- C#子线程更新UI控件的方法实例总结
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- VB读取线程、句柄及写入内存的API代码实例
- C#网络编程基础之进程和线程详解
- C#实现线程安全的简易日志记录方法
- C#中线程同步对象的方法分析
- ASP.NET线程相关配置
- 浅析linux环境下一个进程最多能有多少个线程
- C#实现终止正在执行的线程
- 解析Java线程同步锁的选择方法
- 深入Android线程的相关问题解惑
- 深入探讨linux下进程的最大线程数、进程最大数、进程打开的文件数
- Java线程关闭的3种方法
- JAVA实现线程的三种方法
- 深入Java线程中断的本质与编程原则的概述
- Java线程的控制详解
- Java并发编程示例(二):获取和设置线程信息