多线程的Wait返回它等待的下方

Java多线程生产消费者模型
本文通过Java代码实现了一个简单的多线程生产消费者模型,详细展示了如何使用synchronized、wait、notify等关键字来实现线程间的同步和互斥操作。通过两个消费者线程和一个生产者线程的交互,演示了数据的生产和消费过程,以及线程间的等待与唤醒机制。
  1. 多线程的Wait返回它等待的下方。
     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    package org.vocano.java.tst;
    class ThreadDemo {
        public static void main(String[] args) {
            Buffer buf = new Buffer();
            new Producer(buf).start();
            new Consumer(buf).start();
            new Consumer(buf).start();
        }
    }
    class Producer extends Thread {
        private Buffer buf;
        public Producer(Buffer buf) {
            this.buf = buf;
        }
        public void run() {
            boolean odd = false;
            while(true) {
                synchronized(buf) {
                    System.out.println("Producer get lock!");
                    if(buf.bFull) {
                        System.out.println("Producer wait!!!");
                        try{buf.wait();}catch(Exception e) {}
                        System.out.println("Producer wait return return return !!!!!!! ");
                    }
                    if(odd) {
                        buf.name="jack";    
                        try{Thread.sleep(100);}catch(Exception e) {}
                        buf.sex="female";
                    } else {
                        buf.name="lucy";    
                        try{Thread.sleep(100);}catch(Exception e) {}
                        buf.sex="male";
                    }
                    buf.bFull = true;
                    buf.notify();
                    System.out.println("Producer release lock!");
                }
                odd = !odd;
            }
        }
    }
    class Consumer extends Thread {
        private Buffer buf;
        public Consumer(Buffer buf) {
            this.buf = buf;
        }
        public void run() {
            while(true) {
                synchronized(buf) {
                    System.out.println("Consumer get lock!");
                    if(!buf.bFull) {
                        System.out.println("Consumer wait!!!");
                        try{buf.wait();}catch(Exception e) {}
                        System.out.println("Consumer wait return return return !!!!!!! ");
                    }
                    try{Thread.sleep(500);}catch(Exception e) {}
                    System.out.println(buf.name + " : " + buf.sex);
                    buf.bFull = false;
                    buf.notify();
                    System.out.println("Consumer release lock!");
                }
            }
        }
    }
    class Buffer {
        boolean bFull = false;
        String name = "Unkown";
        String sex = "Unkown";
    }
  2. 输出:可看出Wait的返回时另一个的wait或者release,不是自己getLock,说明notify放回wait的点。
     Java Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Producer get lock!
    Producer release lock!
    Consumer get lock!
    lucy : male
    Consumer release lock!
    Consumer get lock!
    Consumer wait!!!
    Producer get lock!
    Producer release lock!
    Producer get lock!
    Producer wait!!!
    Consumer wait return return return !!!!!!! 
    jack : female
    Consumer release lock!
    Producer wait return return return !!!!!!! 
    Producer release lock!
    Producer get lock!
    Producer wait!!!
    Consumer get lock!

     

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值