首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Thread种/java多线程(代码篇)

2012-09-22 
Thread类/java多线程(代码篇)/* 多线程之间通信本例子 模拟了生产者和消费者的关系。开始消费者调用消费方

Thread类/java多线程(代码篇)

/* 多线程之间通信本例子 模拟了生产者和消费者的关系。开始消费者调用消费方法时处于等待状态,此时唤起生产者线程。生产者开始生产共享数据之后,消费者进行消费,但是当共享数据为空,所有消费者必须等待,生产者继续生产,然后消费者再次消费,如此循环直到程序运行最后,可以看到线程一直等待。注意这个线程进入等待后没有其他线程唤醒,除非强行退出 JVM 环境,否则它一直等待。注意:考虑到程序的安全性,多数情况下使用 notifiAll(),除非明确可以知道唤醒哪一个线程。wait 方法调用的前提条件是当前线程获取了这个对象的锁,也就是说 wait 方法必须放在同步块或同步方法中。 */public class ThreadCommunication{     public static void main(String[ ] args){          Queue q = new Queue();//创建,并初始化一个队列          Producer p = new Producer(q); //创建,并初始化一个生产者          Consumer c = new Consumer(q); //创建,并初始化一个消费者          c.start(); //消费者线程启动          p.start(); //生产者线程启动     }}//生产者消费者线程class Producer extends Thread{//实现生产者线程    Queue q;//声明队列 qProducer(Queue q){ //生产者构造方法     this.q = q; //队列 q 初始化}public void run(){     for(int i=1;i<5;i++){  //循环添加元素           q.put(i);  //给队列中添加新的元素     }}}class Consumer extends Thread{    Queue q;  //声明队列 qConsumer(Queue q){ //消费者构造方法     this.q = q;  //队列 q 初始化}public void run(){     while(true){  //循环消费元素         q.get();  //获取队列中的元素     }}}class Queue{    int value = 0;//声明,并初始化整数类型数据域 value    boolean isEmpty = true;//声明,并初始化布尔类型数据域 isEmpty,用于判断队列的状态      //生产者生产方法    public synchronized void put(int v){        //如果共享数据没有被消费,则生产者等待        if (!isEmpty){              try{                   System.out.println("生产者等待");                   wait();//进入等待状态              }              catch(Exception e){//捕获异常                   e.printStackTrace();//异常信息输出              }     }     value += v;//value 值加 v         isEmpty = false;//isEmpty 赋值为 false         System.out.println("生产者共生产数量:"+v);//输出字符串信息         notify();//生产之后通知消费者消费    }    //消费者消费的方法    public synchronized int get(){         //消费者消费前,如果共享数据已经被消费完,则消费者等待         if (isEmpty){            try{               System.out.println("消费者等待");//输出字符串信息                 wait();//进入等待状态            }            catch(Exception e){//捕获异常                 e.printStackTrace();//异常信息输出            }         }         value--;//value 值-1         if (value < 1){               isEmpty = true;//isEmpty 赋值 true         }         System.out.println("消费者消费一个,剩余:"+value);//输出信息         notify();//消费者消费后,通知生产者生产         return value;//返回 value     }}


热点排行