Java_多线程_阻塞队列BlockingQueue

java.util.concurrent包中的BlockingQueue接口通常用于一个线程生产对象,而另一个线程消费这些对象的场景。

一个线程将会持续生产新对象并将其插入队列中,知道队列达到所能容纳的临界点。也就是说,队列是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会发生阻塞,且一直处于阻塞状态中,直到负责消费的线程从队列中拿走一个对象。负责消费的线程会一直从阻塞队列中拿出对象。如果消费线程尝试从一个空队列中提取对象的话,这个线程将会处于阻塞状态中,知道一个生产线程把一个对象放进队列。

BlockQueue是一个接口,你需要使用它的实现之一来使用,具体的实现有:ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue

package com.scm.servlet;

import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PhoneServlet
 */
@WebServlet("/PhoneServlet")
public class PhoneServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PhoneServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String phone = request.getParameter("phone");
		
		BlockingQueue<String> phones = (BlockingQueue<String>) request.getServletContext().getAttribute("phones");
		try {
			// 加入队列
			phones.put(phone);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		response.getWriter().write("ok");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

package com.scm.filter;

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;


@WebListener
public class SendCodeListener implements ServletContextListener{
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
//		 Queue<String> phones = new LinkedList<String>();
		// 换成阻塞队列
		 BlockingQueue<String> phones = new LinkedBlockingDeque<String>();
		 sce.getServletContext().setAttribute("phones", phones);
		 // 开启一个 线程
		 new Thread(){
			 @Override
			 public void run() {
				while(true) {
					String phone;
					try {
						phone = phones.take();// 阻塞式  取不到值 阻塞
						System.out.println("队列取出"+phone);
						if(phone != null) {
							System.out.println(phone+"---->短信发送成功");
							
						}
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}

			}
		 }.start();	
	}

}

发布了359 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Chill_Lyn/article/details/104156670