【JAVA】简单实现一个阻塞任务队列
2018-02-12 07:20
681 查看
package p18.juc; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; public class MyBlockingTaskQueen<T> { private ConcurrentLinkedQueue<T> queue = new ConcurrentLinkedQueue<>(); private Lock lock = new ReentrantLock(); private Condition cond = lock.newCondition(); private int taskCapacity=10; public MyBlockingTaskQueen(int taskCapacity){ this.taskCapacity = taskCapacity; } /* * 添加任务 */ public void put(T task) { try{ lock.lock(); while(queue.size()>taskCapacity) { System.out.println(Thread.currentThread().getName()+":任务数量达到上限,当前线程被挂起"); cond.await(); } queue.add(task); cond.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } /* * 处理任务 */ public void handle(Consumer<T>cons) { try { lock.lock(); while(queue.size()<=0) { System.out.println(Thread.currentThread().getName()+":当前没有任务,线程被挂起"); cond.await(); } cons.accept(queue.poll()); cond.signalAll(); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } /* * 测试 */ public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(2); MyBlockingTaskQueen<Task> queue = new MyBlockingTaskQueen<>(1); /* * 模拟两个添加任务的线程,共添加2000条任务 */ Thread supplier1 = new Thread(()->{ for (int i = 0; i < 1000; i++) { queue.put(new Task("task"+System.currentTimeMillis())); } System.out.println("==============="); },"生产者1"); Thread supplier2 = new Thread(()->{ for (int i = 0; i < 1000; i++) { queue.put(new Task("task"+System.currentTimeMillis())); } System.out.println("======================"); },"生产者2"); /* * 模拟两个处理任务的线程,每个线程分1000条 */ Thread consumer = new Thread(()->{ for (int i = 0; i < 1000; i++) { queue.handle((task)->System.out.println(Thread.currentThread().getName()+":处理"+task)); } System.out.println("c1执行结束"); latch.countDown(); },"消费者1"); Thread consumer2 = new Thread(()->{ for (int i = 0; i < 1000; i++) { queue.handle((task)->System.out.println(Thread.currentThread().getName()+":处理"+task)); } System.out.println("c2执行结束"); System.out.println(consumer.getState()); latch.countDown(); },"消费者2"); long startT = System.currentTimeMillis(); consumer.start(); consumer2.start(); supplier1.start(); supplier2.start(); latch.await(); long endT = System.currentTimeMillis(); System.out.println("耗费时间:"+(endT-startT)); System.out.println("c1:"+consumer.getState()); System.out.println("c2:"+consumer2.getState()); System.out.println("s1:"+supplier1.getState()); System.out.println("s2:"+supplier2.getState()); System.out.println("队列剩余数量:"+queue.size()); } } class Task{ private String name; public Task(String name) { this.name=name; } @Override public String toString() { return "Task [name=" + name + "]"; } }
相关文章推荐
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个阻塞队列
- java 环形阻塞队列简单实现
- Java实现一个简单的队列---Queue
- 一个简单的阻塞队列实现
- Java:实现简单的阻塞队列
- [原创][Java]一个简单高效的线程安全队列的JAVA实现
- Java通过DelayQueue的实现多线程任务的阻塞队列
- 一个简单的线程池实现(java版)
- 无锁(lock-free)队列的一个简单实现
- 利用java实现一个简单的远程监控程序
- 一个简单的用JAVA实现的屏幕抓图(源代码)
- 利用java实现一个简单的远程监控程序
- 用java实现的一个简单web服务器程序
- 一个简单的线程池实现(java版)
- 循环队列的一个简单实现
- 一个用Java实现的简单的最大堆
- Java进阶:一个简单Thread缓冲池的实现
- 一个简单的Echo Server的Java实现(增强版)
- 一个GUI的简单练习-------- Java记事本 简单实现 陆续完善中……
- 一个java实现的简单日历,采用左树右列表的方式实现,具有参考意义