千家信息网

JAVA中怎么使用Lock和Condition手写阻塞队列

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,今天就跟大家聊聊有关JAVA中怎么使用Lock和Condition手写阻塞队列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。package c
千家信息网最后更新 2025年02月06日JAVA中怎么使用Lock和Condition手写阻塞队列

今天就跟大家聊聊有关JAVA中怎么使用Lock和Condition手写阻塞队列,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

package com.study;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class BlockingQueueDemo {  public static void main(String[] args) {    BlockingQueueDemo blockingQueueDemo = new BlockingQueueDemo();    final BlockingQueueClass blockingQueueClass = blockingQueueDemo.new BlockingQueueClass();    Thread thread = new Thread(new Runnable() {      @Override      public void run() {        while(true){          int value = new Random().nextInt();          System.out.println("准备存数据了");          blockingQueueClass.put(value);          System.out.println("已经存好数据了");        }      }    });    thread.start();        Thread thread2 = new Thread(new Runnable() {      @Override      public void run() {        while(true){          System.out.println("准备取数据了");          Object value = blockingQueueClass.take();          System.out.println("取到的数据为:" + value);        }      }    });    thread2.start();  }  class BlockingQueueClass{    Lock lock = new ReentrantLock();    Condition notFullCondition = lock.newCondition();    Condition notEmptyCondition = lock.newCondition();    Object[] items = new Object[100];    private int putLength,takeLength,count;        public void put(Object object){      lock.lock();      try {        while(count == items.length){          try {            notFullCondition.await();          } catch (InterruptedException error) {            error.printStackTrace();          }        }        items[putLength] = object;        if(++putLength == items.length){          putLength = 0;        }        ++count;        notEmptyCondition.signal();      } catch (Exception e) {        e.printStackTrace();      } finally{        lock.unlock();      }          }        public Object take(){      Object object = new Object();      lock.lock();      try {        while(count == 0){          try {            notEmptyCondition.await();          } catch (InterruptedException e) {            e.printStackTrace();          }        }        object = items[takeLength];        if(++takeLength == items.length){          takeLength = 0;        }        --count;        notFullCondition.signal();      } catch (Exception e) {        e.printStackTrace();        lock.unlock();      }      return object;    }  }}

看完上述内容,你们对JAVA中怎么使用Lock和Condition手写阻塞队列有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0