java队列处理高并发_java队列处理高并发怎么实现?

在java里,实际上队列的用法是多变的,不需要太僵硬的使用,下面我们就来看看队列是如何处理高并发的。

实例代码:/**

* @author fuguangli

* @description 前沿消费者类

* @Create date:    2017/3/7

* @using   EXAMPLE

*/

public class Customer implements Runnable

{

/**

*         抛出异常    特殊值        阻塞         超时

插入    add(e)    offer(e)    put(e)    offer(e, time, unit)

移除    remove()    poll()    take()    poll(time, unit)

检查    element()    peek()    不可用    不可用

*/

private BlockingQueue blockingQueue;

private AtomicInteger count = new AtomicInteger();

public Customer(BlockingQueue blockingQueue)

{

this.blockingQueue = blockingQueue;

}

/**

* When an object implementing interface Runnable is used

* to create a thread, starting the thread causes the object's

run method to be called in that separately executing

* thread.

* The general contract of the method run is that it may

* take any action whatsoever.

*

* @see Thread#run()

*/

@Override

public void run()

{

System.out.println("消费者线程启动...");

LockFlag.setCustomerRunningFlag(true);

try

{

while (LockFlag.getProducerRunningFlag())

{

System.out.println(Thread.currentThread()

.getId() + "I'm Customer.Queue current size=" + blockingQueue.size());

String data = (String) blockingQueue.poll(10, TimeUnit.SECONDS);

if (data != null)

{

System.out.println(Thread.currentThread()

.getId() + "*************正在消费数据 data=" + data);

}

else

{

//表示超过取值时间,视为生产者不再生产数据

System.out.println(Thread.currentThread()

.getId() + "队列为空无数据,请检查生产者是否阻塞");

}

Thread.sleep(50);

}

System.err.println("消费者程序执行完毕");

}

catch (InterruptedException e)

{

e.printStackTrace();

System.err.println("消费者程序退出");

LockFlag.setCustomerRunningFlag(false); //异常退出线程

Thread.currentThread()

.interrupt();

}

}

}package com.qysxy.framework.queue;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.TimeUnit;

import java.util.concurrent.atomic.AtomicInteger;

/**

* @author fuguangli

* @description 队列生产者类

* @Create date:    2017/3/7

* @using       EXAMPLE

*/

public class Producer implements Runnable

{

/**

*         抛出异常    特殊值        阻塞         超时

插入    add(e)    offer(e)    put(e)    offer(e, time, unit)

移除    remove()    poll()    take()    poll(time, unit)

检查    element()    peek()    不可用    不可用

*/

private BlockingQueue blockingQueue;

private AtomicInteger count = new AtomicInteger();

public Producer(BlockingQueue blockingQueue)

{

this.blockingQueue = blockingQueue;

}

/**

* When an object implementing interface Runnable is used

* to create a thread, starting the thread causes the object's

run method to be called in that separately executing

* thread.

* The general contract of the method run is that it may

* take any action whatsoever.

*

* @see Thread#run()

*/

@Override

public void run()

{

System.out.println("生产者线程启动...");

LockFlag.setProducerRunningFlag(true);

try

{

while (LockFlag.getProducerRunningFlag())

{

String data = "data:" + count.incrementAndGet();

if (blockingQueue.offer(data, 10, TimeUnit.SECONDS))

{

//返回true表示生产数据正确

System.out.println("^^^^^^^^^^^^^^正在生产数据 data=" + data);

}

else

{

//表示阻塞时间内还没有生产者生产数据

System.out.println("生产者异常,无法生产数据");

}

Thread.sleep(50);

}

}

catch (InterruptedException e)

{

e.printStackTrace();

System.err.println("生产者程序退出");

LockFlag.setProducerRunningFlag(false); //异常退出线程

Thread.currentThread()

.interrupt();

}

}

}package com.qysxy.framework.queue;

/**

* @author fuguangli

* @description 前沿生产者消费者模型的锁类

* @Create date:    2017/3/7

*/

public class LockFlag

{

/**

* 生产者互斥锁

*/

private static Boolean producerRunningFlag = false;

/**

* 消费者互斥锁

*/

private static Boolean customerRunningFlag = false;

public static Boolean getProducerRunningFlag()

{

return producerRunningFlag;

}

public static void setProducerRunningFlag(Boolean producerRunningFlag)

{

LockFlag.producerRunningFlag = producerRunningFlag;

}

public static Boolean getCustomerRunningFlag()

{

return customerRunningFlag;

}

public static void setCustomerRunningFlag(Boolean customerRunningFlag)

{

LockFlag.customerRunningFlag = customerRunningFlag;

}

}package com.qysxy.framework.queue;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.Queue;

import java.util.concurrent.*;

/**

* @author fuguangli

* @description 前沿队列实用类,用于大量并发用户

* @Create date:    2017/3/7

*/

public class BlockingQueueHelper

{

private static final Integer maxQueueSize = 1000;

private static BlockingQueue blockingQueue = new LinkedBlockingQueue(maxQueueSize);

private static ExecutorService threadPool = Executors.newCachedThreadPool();

public static BlockingQueue getBlockingQueue()

{

if (blockingQueue == null)

{

blockingQueue = new LinkedBlockingQueue(maxQueueSize);

}

return blockingQueue;

}

/**

* @param o 队列处理对象(包含request,response,data)

*/

public static void requestQueue(Object o)

{

//检测当前的队列大小

if (blockingQueue != null && blockingQueue.size() 

{

//可以正常进入队列

if (blockingQueue.offer(o))

{

//添加成功,检测数据处理线程是否正常

if (LockFlag.getCustomerRunningFlag())

{

//说明处理线程类正常运行

}

else

{

//说明处理线程类停止,此时,应重新启动线程进行数据处理

LockFlag.setCustomerRunningFlag(true);

//example:run

Customer customer = new Customer(blockingQueue);

threadPool.execute(customer);

}

}

else

{

//进入队列失败,做出相应的处理,或者尝试重新进入队列

}

}

else

{

//队列不正常,或队列大小已达上限,做出相应处理

}

}

}

以上就是本篇文章的所有内容,如若还有其他不懂的java编程常见问题,请记得关注我们寻找答案。

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值