队列像栈一样,都是表,队列的特点是在队列的一端(队尾)进行插入而在另一端(对头)进行删除操作,采取的是先进先出的策略。
阻塞队列(同步):
LinkedBlockingQueue<E>:java.util.concurrent这是一个基于链表实现的的阻塞队列(当多个线程操作共同的队列时不需要额外的同步),他的范围可以自由的设定,如果不设定则默认为Integer.MAX_VALUE.
ArrayBlockingQueue也是一个阻塞队列,底层有数组实现,但他必须指定队列的大小.
非阻塞队列(异步):
ConcurrentLinkedQueue<E>:java.util.concurrent这也是一个基于链表的线程安全的非阻塞队列,他是一个无界队列,当许多的线程共享访问一个公共的collection时,ConcurrentLinkedQueue队列是一个很好地选择,此队列不允许null元素.
在我们现实生活中的每次排队就是一个队列,在java编程中也有好多问题需要用队列解决:网络爬虫抓取了大量网络信息生成的warc文件需要我们来解析,如何解析这些文件,又如何更新这些文件在数据库中的信息呢?
在数据库中设置一个字段status来标注warc文件是否解析过,0为未解析,1为已解析。程序中通过Timer调度不断地查询数据库,并将未解析的warc文件信息放入到队列当中,遍历队列中信息,解析队列中的文件并将解析后的数据更新数据库.
1、建立队列.
阻塞队列(同步):
LinkedBlockingQueue<E>:java.util.concurrent这是一个基于链表实现的的阻塞队列(当多个线程操作共同的队列时不需要额外的同步),他的范围可以自由的设定,如果不设定则默认为Integer.MAX_VALUE.
ArrayBlockingQueue也是一个阻塞队列,底层有数组实现,但他必须指定队列的大小.
非阻塞队列(异步):
ConcurrentLinkedQueue<E>:java.util.concurrent这也是一个基于链表的线程安全的非阻塞队列,他是一个无界队列,当许多的线程共享访问一个公共的collection时,ConcurrentLinkedQueue队列是一个很好地选择,此队列不允许null元素.
在我们现实生活中的每次排队就是一个队列,在java编程中也有好多问题需要用队列解决:网络爬虫抓取了大量网络信息生成的warc文件需要我们来解析,如何解析这些文件,又如何更新这些文件在数据库中的信息呢?
在数据库中设置一个字段status来标注warc文件是否解析过,0为未解析,1为已解析。程序中通过Timer调度不断地查询数据库,并将未解析的warc文件信息放入到队列当中,遍历队列中信息,解析队列中的文件并将解析后的数据更新数据库.
1、建立队列.
import java.util.*;
import java.util.concurrent.LinkedBlockingQueue;
public class TaskQueue {
private static LinkedBlockingQueue<SolrTask> queue = new LinkedBlockingQueue<SolrTask>(2000);
public static boolean enQueue(SolrTask task){
boolean status = queue.offer(task);
System.out.println("queue Size = "+TaskQueue.size());
return status;
}
public static boolean enQueue(Collection<SolrTask> tasks){
boolean status = queue.addAll(tasks);
System.out.println("Queue Size = "+