Java并发编程-29-非阻塞式线程安全列表-ConcurrentLinkedDeque

来源:互联网 发布:300663科蓝软件 编辑:程序博客网 时间:2024/05/16 06:56

一、ConcurrentLinkedDeque

public class ConcurrentLinkedDeque<E>    extends AbstractCollection<E>    implements Deque<E>, java.io.Serializable

提供的方法


二、主要的方法

public E pollFirst() :返回第一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常

public E pollLast():返回最后一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常

public E poll():返回第一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常

public E getFirst():返回第一个元素,但不会移除这个元素.如果列表为空,抛出NoSuchElementException异常

public E getLast():返回最后一个元素,但不会移除这个元素.如果列表为空,抛出NoSuchElementException异常

public E peek() :返回第一个元素,并且移除这个元素,如果列表为空,抛出NullPointerException异常

public E peekFirst():返回第一个元素,并且移除这个元素,如果列表为空,抛出NullPointerException异常

public E peekLast():返回最后一个元素,并且移除这个元素,如果列表为空,抛出NullPointerException异常

public E removeFirst():返回第一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常

public boolean remove(Object o):返回第一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常

public E removeLast():返回最后一个元素,并且移除这个元素,如果列表为空,抛出NoSuchElementException异常


三、测试。向列表中添加和删除大量的元素

package com.concurrencycollection;import java.util.concurrent.ConcurrentLinkedDeque;/** * 添加大量的数据到一个列表 * @author Nicholas * */public class AddTask implements Runnable {private ConcurrentLinkedDeque<String> concurrentLinkedDeque;public AddTask(ConcurrentLinkedDeque<String> concurrentLinkedDeque) {this.concurrentLinkedDeque = concurrentLinkedDeque;}@Overridepublic void run() {String name = Thread.currentThread().getName();for (int i = 0; i < 10000; i++) {concurrentLinkedDeque.add(name + " : Element " + i);}}}

package com.concurrencycollection;import java.util.concurrent.ConcurrentLinkedDeque;/** * 从这个列表移除大量的数据 * @author Nicholas * */public class PollTask implements Runnable{private ConcurrentLinkedDeque<String> concurrentLinkedDeque;public PollTask(ConcurrentLinkedDeque<String> concurrentLinkedDeque) {this.concurrentLinkedDeque = concurrentLinkedDeque;}@Overridepublic void run() {for (int i = 0; i < 5000; i++) {concurrentLinkedDeque.pollFirst();concurrentLinkedDeque.pollLast();}}}

package com.concurrencycollection;import java.util.Map;import java.util.concurrent.ConcurrentLinkedDeque;import java.util.concurrent.ConcurrentNavigableMap;import java.util.concurrent.ConcurrentSkipListMap;public class Main {public void testConcurrentLinkedDeque() {ConcurrentLinkedDeque<String> concurrentLinkedDeque = new ConcurrentLinkedDeque<String>();Thread[] threads = new Thread[100];for (int i = 0; i < threads.length; i++) {AddTask addTask = new AddTask(concurrentLinkedDeque);threads[i] = new Thread(addTask);threads[i].start();}System.out.println("Main : AddTask threads have been launched..."+ threads.length);// 等待线程完成for (int i = 0; i < threads.length; i++) {try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Main : Size of the list "+ concurrentLinkedDeque.size());for (int i = 0; i < threads.length; i++) {PollTask pollTask = new PollTask(concurrentLinkedDeque);threads[i] = new Thread(pollTask);threads[i].start();}System.out.println("Main : PollTask threads have been launched..."+ threads.length);// 等待线程完成for (int i = 0; i < threads.length; i++) {try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Main : Size of the list "+ concurrentLinkedDeque.size());}public void testContact() {ConcurrentSkipListMap<String, Contact> concurrentSkipListMap = new ConcurrentSkipListMap<String, Contact>();Thread[] threads = new Thread[25];int counter = 0;for (char i = 'A'; i < 'Z'; i++) {Task task = new Task(concurrentSkipListMap, String.valueOf(i));threads[counter] = new Thread(task);threads[counter].start();counter++;}for (int i = 0; i < threads.length; i++) {try {threads[i].join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("Main : Size of the map "+ concurrentSkipListMap.size());Map.Entry<String, Contact> elementEntry;Contact contact;elementEntry = concurrentSkipListMap.firstEntry();contact = elementEntry.getValue();System.out.println("Main : First Entry :" + contact);elementEntry = concurrentSkipListMap.lastEntry();contact = elementEntry.getValue();System.out.println("Main : Last Entry :" + contact);// 取得子映射System.out.println("Main : submap from A1996 to B1002:");ConcurrentNavigableMap<String, Contact> subMap = concurrentSkipListMap.subMap("A1996", "B1002");do {elementEntry = subMap.pollFirstEntry();if (elementEntry != null) {contact = elementEntry.getValue();System.out.println("Contact : " + contact);}} while (elementEntry != null);}public static void main(String[] args) {// new Main().testConcurrentLinkedDeque();new Main().testContact();}}



0 0
原创粉丝点击