一、ConcurrentLinkedDeque

  1. public class ConcurrentLinkedDeque<E>
  2. extends AbstractCollection<E>
  3. 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异常
public class AddTask implements Runnable {
private ConcurrentLinkedDeque<String> linkedDeque;
public AddTask(ConcurrentLinkedDeque<String> linkedDeque) {
super();
this.linkedDeque = linkedDeque;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
for (int i = 0; i < 10000; i++) {
linkedDeque.add(name + ": Element " + i);
}
}
}
public class PollTask implements Runnable {
private ConcurrentLinkedDeque<String> linkedDeque;
public PollTask(ConcurrentLinkedDeque<String> linkedDeque) {
super();
this.linkedDeque = linkedDeque;
}
@Override
public void run() {
for (int i = 0; i < 5000; i++) {
linkedDeque.pollFirst();
linkedDeque.pollLast();
}
}
}
public class ConcurrentLinkedDequeMain {
public static void main(String[] args) {
ConcurrentLinkedDeque<String> linkedDeque = new ConcurrentLinkedDeque<String>();
Thread threads[] = new Thread[100];
for (int i = 0; i < threads.length; i++) {
AddTask task = new AddTask(linkedDeque);
threads[i] = new Thread(task);
threads[i].start();
}
System.out.println("Main:"+threads.length+" AddTask Threads has Launched");
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:" + linkedDeque.size()); Thread threads2[] = new Thread[100];
for (int i = 0; i < threads2.length; i++) {
PollTask task = new PollTask(linkedDeque);
threads2[i] = new Thread(task);
threads2[i].start();
}
System.out.println("Main:" + threads2.length+ " PollTask Threads has Launched");
for (int i = 0; i < threads2.length; i++) {
try {
threads2[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Main: Size of the List:" + linkedDeque.size());
}
}
Main:100 AddTask Threads has Launched
Main: Size of the List:1000000
Main:100 PollTask Threads has Launched
Main: Size of the List:0

非阻塞式线程安全列表-ConcurrentLinkedDeque的更多相关文章

  1. Java基础——NIO(二)非阻塞式网络通信与NIO2新增类库

    一.NIO非阻塞式网络通信 1.阻塞与非阻塞的概念  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在 ...

  2. Swing做的非阻塞式仿飞秋聊天程序

    采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...

  3. 阻塞式和非阻塞式IO

    有很多人把阻塞认为是同步,把非阻塞认为是异步:个人认为这样是不准确的,当然从思想上可以这样类比,但方式是完全不同的,下面说说在JAVA里面阻塞IO和非阻塞IO的区别 在JDK1.4中引入了一个NIO的 ...

  4. Java IO(3)非阻塞式输入输出(NIO)

    在上篇<Java IO(2)阻塞式输入输出(BIO)>的末尾谈到了什么是阻塞式输入输出,通过Socket编程对其有了大致了解.现在再重新回顾梳理一下,对于只有一个“客户端”和一个“服务器端 ...

  5. Java基础知识强化之多线程笔记07:同步、异步、阻塞式、非阻塞式 的联系与区别

    1. 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就必须先得到返回值了. 换句话话说,调用者主动等待这个"调用"的结果. 对于 ...

  6. 为什么IO多路复用需要采用非阻塞式IO

    近段时间开始学习<Unix网络编程>,代码实现了一个简单的IO多路复用+阻塞式的服务端,在学习了非阻塞式IO后,有一个疑问,即: 假如调用了select,并且关注了几个描述字,当关注的描述 ...

  7. 非阻塞式I/O

    套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类 (1)输入操作,包括read,readv,recv ...

  8. 4.NIO的非阻塞式网络通信

    /*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...

  9. NIO 的非阻塞式网络通信

    1.阻塞与非阻塞   ①  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时, 该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因 ...

随机推荐

  1. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  2. React中使用CSSTransitionGroup插件实现轮播图

    动画效果,是一个页面上必不可少的功能,学习一个新的东西,当然就要学习,如何用新的东西,用它的方法去实现以前的东西啦.今天呢,我就在这里介绍一个试用react-addons-css-transition ...

  3. 【Electron】Electron开发入门(五):项目打包

    一.安装 electron-packager PS:安装之前,先复制一份package.json文件到./app目录下,然后改下./app目录下package.json里 "main&quo ...

  4. 老李分享:webservice是什么?2

    web service 组件 基本的 web service 平台是 XML + HTTP.所有标准的 web service 使用以下组件: SOAP(简单对象访问协议) UDDI(通用描述.发现与 ...

  5. 老李分享:loadrunner用javavuser进行接口测试

    老李分享:loadrunner用javavuser进行接口测试 在这里分享一个poptest培训过程中案例,在日常工作中会遇到被测试系统通讯都是通过加密的数据包,加密算法是公司自己开发的,并且发送的数 ...

  6. Hybris license过期的解决办法

    license过期编译是可以通过的,但是启动服务会报错: LICENSE VERIFICATION HAS FAILED! Your demo/develop license has expired, ...

  7. matlab函数:residue和residuez的用法

    一.residue函数 1. 概念:在部分分式展开式和多项式系数之间转换.(Convert between partial fraction expansion and polynomialcoeff ...

  8. 打造比Dictionary还要快2倍以上的字查找类

    针对一个长度为n的数组. [1,2,3,4,5,6,7,8,9] 最快的通用查找类是Dictionary其采用hashcode算法,复杂度为O(1). 而上大学时,最快的查找法为二分查找法,复杂度为O ...

  9. __init__.py

    python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时,将事先写好的.py文件拷贝 到当前目录,或者是在sys.path中增加事先写好的 ...

  10. .net 图片压缩

    压缩图片方法: /// <summary> /// 生成缩略图 /// </summary> /// <param name="originalImagePat ...