今天就跟大家聊聊有关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手写阻塞队列有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。