一、非阻塞式线程安全列表 ConcurrentLinkedDeque
ConcurrentLinkedDeque<String> deque = new ConcurrentLinkedDeque<>();
for (int i=0;i<10;i++){
Thread t1 = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
deque.add(String.valueOf(j));
}
});
t1.start();
t1.join();
}
System.out.println(deque.size()); //100000
deque.getFirst(); deque.getLast();
//返回列表中的第一个和最后一个。元素不会被移除,如果列表为空将抛出NoSuchElementException
deque.peek();deque.peekFirst();deque.peekLast();
//返回中第一个和最后一个,元素不会被移除,如果列表为空返回null
deque.pollLast();deque.pollFirst();
//返回列表中第一个和最后一个,并移除元素。不会抛出异常
deque.remove();deque.removeFirst();deque.removeLast();
//返回第一个和最后一个,并移除元素。列表为空将抛出异常
二、阻塞式线程列表
LinkedBlockingDeque<String> blockingDeque = new LinkedBlockingDeque<>();
阻塞与非阻塞的主要区别:阻塞式列表在插入和删除操作时,如果列表已满或为空,操作不被立即执行,而是将调用这个操作的线程阻塞
直到操作可以执行成功。
三、按优先级排序的阻塞式线程安全列表 PriorityBlockingQueue
PriorityBlockingQueue<String> blockingQueue = new PriorityBlockingQueue<>();
PriorityBlockingQueue 中的每个元素都要实现 Comparable接口。元素越大越靠后
特性:它是阻塞数据结构。当它的方法被调用并且不能立即执行时,调用这个方法的线程将被阻塞直到方法执行成功。
四、带延迟元素的线程安全列表
DelayQueue<Delayed> delayQueue = new DelayQueue<>();
1.它可以存放带有激活日期的元素,当从该列表取取值时,未来的元素将被忽略
2.它的元素必须实现 Delayed 接口
五、并发随机数 ThreadLocalRandom
ThreadLocalRandom.current().nextInt();