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 }}