1,任何的高并发,请求总是会有一个顺序的
2, java的队列的数据结构是先进先出的取值顺序
3, BlockingQueue类(线程安全)(使用方法可以百度)
一般使用
利用以上几点,我们可以把高并发时候的请求放入一个队列,队列的大小可以自己定义,比如队列容量为1000个的数据,那么可以利用过滤器或者拦截器把当前的请求放入队列,如果队列的容量满了,其余的请求可以丢掉或者作出相应回复
<强>具体实施:强>
利用生产者,消费者模型:
将队列的请求一一处理完。
,上代码:
/* * * @author fuguangli * @description前沿消费者类 * @Create日期:2017/3/7 * @using例子 */公共类客户实现Runnable {/* * *抛出异常特殊值阻塞超时 插入添加(e)提供(e)把(e)提供(e、时间单位) 移除remove()民意调查()()民意调查(时间、单位) 检查元素()peek()不可用不可用 */私人BlockingQueue BlockingQueue; 私人AtomicInteger数=new AtomicInteger (); 公共客户(BlockingQueue BlockingQueue) { 这一点。blockingQueue=blockingQueue; }/* * *当一个对象实现的接口& lt; code> Runnable使用 *创建一个线程,线程对象的原因 * & lt; code> run</code>将被调用的方法分别执行 *线程。 * & lt; p/比; *方法的总承包合同& lt; code> run是,它可能 *采取任何行动。 * * # @see线程运行() */@Override 公共空间run () { System.out.println(“消费者线程启动…”); LockFlag.setCustomerRunningFlag(真正的); 尝试{ 而(LockFlag.getProducerRunningFlag ()) { .getId System.out.println (Thread.currentThread()() +“我客户。当前队列大?" + blockingQueue.size ()); 字符串数据=https://www.yisu.com/zixun/blockingQueue(字符串)。调查(10、TimeUnit.SECONDS); 如果(数据!=null) { .getId System.out.println (Thread.currentThread()() +”* * * * * * * * * * * * *正在消费数据数据=" https://www.yisu.com/zixun/+数据); 其他}{//表示超过取值时间,视为生产者不再生产数据 .getId System.out.println (Thread.currentThread()() +”队列为空无数据,请检查生产者是否阻塞”); } thread . sleep (50); } System.err.println(“消费者程序执行完毕”); }捕捉(InterruptedException e) { e.printStackTrace (); System.err.println(“消费者程序退出”); LockFlag.setCustomerRunningFlag(假);//异常退出线程 .interrupt Thread.currentThread () (); } } } >之前包com.qysxy.framework.queue; 进口java.util.concurrent.BlockingQueue; 进口java.util.concurrent.TimeUnit; 进口java.util.concurrent.atomic.AtomicInteger;/* * * @author fuguangli * @description队列生产者类 * @Create日期:2017/3/7 * @using例子 */公共类生产商实现Runnable {/* * *抛出异常特殊值阻塞超时 插入添加(e)提供(e)把(e)提供(e、时间单位) 移除remove()民意调查()()民意调查(时间、单位) 检查元素()peek()不可用不可用 */私人BlockingQueue BlockingQueue; 私人AtomicInteger数=new AtomicInteger (); 公共生产商(BlockingQueue BlockingQueue) { 这一点。blockingQueue=blockingQueue; }/* * *当一个对象实现的接口& lt; code> Runnable使用 *创建一个线程,线程对象的原因 * & lt; code> run</code>将被调用的方法分别执行 *线程。 * & lt; p/比; *方法的总承包合同& lt; code> run是,它可能 *采取任何行动。 * * # @see线程运行() */@Override 公共空间run () { System.out.println(“生产者线程启动…”); LockFlag.setProducerRunningFlag(真正的); 尝试{ 而(LockFlag.getProducerRunningFlag ()) { 字符串数据="数据:" + count.incrementAndGet (); 如果(blockingQueue。提供(数据、10 TimeUnit.SECONDS)) {//返回真正的表示生产数据正确 system . out。println(“^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^正在生产数据数据=" https://www.yisu.com/zixun/+数据); 其他}{//表示阻塞时间内还没有生产者生产数据 System.out.println(“生产者异常,无法生产数据”); } thread . sleep (50); } }捕捉(InterruptedException e) { e.printStackTrace (); System.err.println(“生产者程序退出”); LockFlag.setProducerRunningFlag(假);//异常退出线程 .interrupt Thread.currentThread () (); } } }java web如何解决瞬间高并发