ArrayBlockingQueue take()操作

编程入门 行业动态 更新时间:2024-10-12 18:19:18

ArrayBlockingQueue  take()<a href=https://www.elefans.com/category/jswz/34/1770947.html style=操作"/>

ArrayBlockingQueue take()操作

 内部类实现Runable接口,通过while(true)循环来执行业务逻辑,首先通过ArrayBlockingQueue.take()来获取需要执行的任务,当队列为空,内部会进入空循环等待,避免过高耗费cpu。

业务类: 

package com.java.innerclassthread ;import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;public class ResourceSynchronizeTaskExecutor {BlockingQueue<String> taskQueue;public ResourceSynchronizeTaskExecutor() {System.out.println("start [RESOURCE SYNCHRONIZE TASK Executor] ...");taskQueue = new ArrayBlockingQueue<String>(200);for (int i = 0; i < 5; i++) {new Thread(new ResourceSynchronizeWorker()).start();try {Thread.sleep(200);} catch (InterruptedException e) {System.out.println("start sync worker err");}}}//	@Overridepublic void execute(String String) {}//	@Overridepublic void execute(List<String> Strings) {for (String String : Strings) {try {taskQueue.put(String);} catch (Exception e) {System.out.println("put queue error");}}}class ResourceSynchronizeWorker implements Runnable {String String;boolean isRunning = true;public ResourceSynchronizeWorker() {}public void run() {System.out.println("sync start...");while (isRunning) {try {System.out.println("xunhuanzhixing................");String = taskQueue.take();} catch (Exception e) {}}}}}

测试类,运行时首先从内存中获取被执行类的实例,如果为空,则实例化: 

package com.java.innerclassthread;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class InnerClassThreadTest {Map<String,ResourceSynchronizeTaskExecutor> cache = new HashMap<String,ResourceSynchronizeTaskExecutor>();public static void main(String[] args) {new InnerClassThreadTest().running(); }public void running(){boolean isRunning = true;while(isRunning){String [] StringActions = new String [(int)(Math.random()*20)];for (int index = 0 ;index <StringActions.length ;index ++){StringActions[index] = "index"+index;}ResourceSynchronizeTaskExecutor ResourceSynchronizeTaskExecutor = getCache ();List<String> theStrings = new ArrayList<String> ();theStrings.add(new String()) ;ResourceSynchronizeTaskExecutor.execute(theStrings);if (StringActions.length < 10){System.out.println("length:"+StringActions.length);try {Thread.sleep(10000);} catch (Exception e) {}}}}public ResourceSynchronizeTaskExecutor getCache(){ResourceSynchronizeTaskExecutor executor = cache.get("ResourceSynchronizeTaskExecutor.class");if (executor == null ){executor = new ResourceSynchronizeTaskExecutor();cache.put("ResourceSynchronizeTaskExecutor.class", executor) ;}return executor ;}}

JDK 中ArrayBlockingQueue take()方法源码:

    public E poll() {final ReentrantLock lock = this.lock;lock.lock();try {return (count == 0) ? null : dequeue();} finally {lock.unlock();}}public E take() throws InterruptedException {final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {while (count == 0)notEmpty.await();return dequeue();} finally {lock.unlock();}}

当使用take 从queue中获取任务时,当任务为空,则释放cpu进行等待;

当使用pull()来从queue中获取任务进行处理时 ,如果count==0,则直接返回null,造成的结果时,如果在while(true){}中执行获取任务操作,会造成cpu占用率100%。

 

更多推荐

ArrayBlockingQueue take()操作

本文发布于:2024-02-26 07:34:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701753.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作   ArrayBlockingQueue

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!