Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

消息队列(第一版) #1

Open
pangh-space opened this issue Sep 5, 2019 · 0 comments
Open

消息队列(第一版) #1

pangh-space opened this issue Sep 5, 2019 · 0 comments

Comments

@pangh-space
Copy link
Owner

package com.ph.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class ShareData{
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

public void increment() throws Exception{

    lock.lock();
    try{
        // 1. 判断
        while (number != 0){
            // 等待不能生产
            condition.await();
        }
        // 2. 干活
        number++;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 3.通知、唤醒
        condition.signalAll();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        lock.unlock();
    }



}

public void decrement() throws Exception{

    lock.lock();
    try{
        // 1. 判断
        while (number == 0){
            // 等待不能生产
            condition.await();
        }
        // 2. 干活
        number--;
        System.out.println(Thread.currentThread().getName() + "\t " + number);
        // 3.通知、唤醒
        condition.signalAll();
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        lock.unlock();
    }



}

}

/**

  • @author panghui
  • @Version 1.0
  • @SInCE 2019-09-03
  • 一个初始值为零的变量,两个线程对其进行交替操作,一个加1一个减1,来5轮
    1. 线程-操作-资源类
    1. 判断-干活-通知
    1. 防止虚假唤醒机制

*/
public class ProdConsumer_TraditionDemo {

public static void main(String[] args) throws Exception{

    ShareData shareData = new ShareData();

    new Thread(()->{

        for (int i = 1; i <= 5; i++) {
            try {
                shareData.increment();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    },"AA").start();

    new Thread(()->{

        for (int i = 1; i <= 5; i++) {
            try {
                shareData.decrement();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    },"BB").start();

}

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant