java web如何解决瞬间高并发

  

1,任何的高并发,请求总是会有一个顺序的

  

2, java的队列的数据结构是先进先出的取值顺序

  

3, BlockingQueue类(线程安全)(使用方法可以百度)

  

 java web如何解决瞬间高并发

  

一般使用

  

利用以上几点,我们可以把高并发时候的请求放入一个队列,队列的大小可以自己定义,比如队列容量为1000个的数据,那么可以利用过滤器或者拦截器把当前的请求放入队列,如果队列的容量满了,其余的请求可以丢掉或者作出相应回复

  

<强>具体实施:

  

利用生产者,消费者模型:

  

 java web如何解决瞬间高并发

  

将队列的请求一一处理完。

  

,上代码:
  

     /* *   * @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如何解决瞬间高并发