peek

ThreadPoolExecutor源码分析及阻塞提交任务方法

巧了我就是萌 提交于 2019-12-05 15:18:33
ThreadPoolExecutor源码 ThreadPoolExecutor 基本使用参考: ThreadPoolExecutor执行过程分析 线程池状态标志 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); ctl 保存了线程池的运行状态(runState)和线程池内有效线程数量(workerCount)。 // Packing and unpacking ctl private static int runStateOf(int c) { return c & ~CAPACITY; } private static int workerCountOf(int c) { return c & CAPACITY; } private static int ctlOf(int rs, int wc) { return rs | wc; } 用 ctl 的高3位来表示线程池的运行状态, 用低29位来表示线程池内有效线程的数量。ctlOf() 方法用于计算出ctl的值。runStateOf()和workerCountOf()方法分别通过CAPACITY来计算得到其runState和workerCount,CAPACITY=29个1。 线程池的运行状态: // runState is

搞懂 Java LinkedList 源码

牧云@^-^@ 提交于 2019-12-05 15:10:01
LinkedList 源码分析 由于最近工作有点忙,进行了 APP 的部分优化,期间也学习了很多有关于布局优化和其他性能优化的知识,但是仍然觉得不太成体系,期待能有更多的优质的性能优化实战文章能够涌现出来,以便于大家一起交流学习。 周末有时间把手头的工作放一放,来继续进行 Java 集合源码的学习。今天来学习下 「LinkedList」的源码。 LinkedList 的概述 LinkedList 的构造方法 LinkedList 的增删改查。 LinkedList 作为队列(Queue)使用的时候增删改查。 LinkedList 的遍历方法 LinkedList 的概述 先来看下 LinkedList 的继承体系图,这里悄悄告诉大家一个方法在学习源码的时候如何查看一个类的继承体系的方法,第一步打开 IntelliJ IDEA 找到你要查看的类 ,第二步点击右键,选择 Diagrams 选择二级菜单的任意一项,就可以得到下面这样一个体系图,还有好多方便的操作,大家可以通过这篇文章来了解下 使用IntelliJ IDEA查看类的继承关系图形 。 图中蓝色实线箭头是指继承关系 ,绿色虚线箭头是指接口实现关系。 LinkedList 继承自 AbstrackSequentialList 并实现了 List 接口以及 Deque 双向队列接口,因此 LinkedList 不但拥有 List

剑指offer 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))

早过忘川 提交于 2019-12-05 09:15:58
需要在时间复杂度O(1)内完成查找最小值,需要定义两个栈,一个现有值栈,一个最小值栈入栈:如果新入栈的元素小于最小值栈的栈顶,那么不仅将新元素入现有值栈也要入最小值栈出栈:如果两个栈的栈顶元素相同,那么均出栈,否则只要出栈现有值栈 package cn.njupt.demo3;import java.util.Stack;public class Stack1 { private Stack<Integer> myStack=new Stack<>(); private Stack<Integer> minStack=new Stack<>(); //一个现有值栈,一个最小值栈 public void push(int node) { myStack.push(node); if(minStack.isEmpty() || node<minStack.peek()){ minStack.push(node); } } public void pop() { if(myStack.peek()==minStack.peek()){ myStack.pop(); minStack.pop(); } else{ myStack.pop(); } } public int top() { return myStack.peek(); } public int min() { return

C#: Using StreamReader to read line from txt file, but Peek() return -1 even there are a lot of lines left

喜你入骨 提交于 2019-12-05 02:57:15
问题 I use Peek() method of StreamReader to check whether there are more lines need to be processed. There are more than 1000 lines in my file, but Peek() suddenly return -1 when it reachs line#750. I checked but seems no differences between line#750 and #751. Even I deleted line#750 and 751, it will still break up at other line. Below are my codes for your information: try { String ftpserver = ftp + filename; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpserver)); reqFTP.UsePassive =

学习PriorityQueue源码

天涯浪子 提交于 2019-12-05 01:32:51
本来想先看看DelayQueue,结果里面用到了PriorityQueue,所以先学习一下PriorityQueue的编码逻辑。 基于优先级堆的无界优先级队列。优先级队列的元素根据其自然顺序排序,或者由队列构造时提供的比较器排序,具体取决于使用的构造函数。优先级队列不允许null元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能导致ClassCastException)。 此队列的头部是指定排序的最小元素。如果多个元素被绑定为最小值,则头部是这些元素之一。 PriorityQueue是无限制的,但具有内部容量,用于控制用于存储队列中元素的数组的大小。它始终至少与队列大小一样大。当元素添加到优先级队列时,其容量会自动增加。 PriorityQueue不是线程安全的,所以多线程操作的时候要注意一下。 我们可以看到PriorityQueue的构造方法比较多,我们看一下比较有特点的,下面是赋值一个initialCapacity和比较器comparator的,如果没有初始化,那么会使用默认值DEFAULT_INITIAL_CAPACITY = 11 还有对于集合的构造函数,这里对SortedSet和PriorityQueue特殊处理了一下,获取comparator,但是还是有PriorityQueue(PriorityQueue<? extends E> c

Peek into Conn without reading in go

懵懂的女人 提交于 2019-12-05 01:32:37
问题 I have a server net.Conn , and I'd like to peek into it before reading out bytes, to check if it's a plain text protocol the client is trying to use, or SSL/TLS. Checking http://golang.org/pkg/net/, it seems the Conn interface does not have anything like that. I know I could use an iobuf.Reader , but I'd like to get a TLS Conn via tls.Conn(conn, config) if it turns out the client is using SSL/TLS, and iobuf.Reader would read from the original Conn , thus the handshake in tls.Conn would fail.

并发容器学习—DelayQueue与PriorityBlockingQueue

ぃ、小莉子 提交于 2019-12-05 01:32:11
一、DelayQueue并发容器 1.Delay Queue的底层实现 Delay Queue是一个线程安全且无界的阻塞队列,只有在延迟时间满足后才能获取队列中的元素,因此队列中的元素必须实现Delay接口,在创建元素时指定多久时间后才能从队列中获取该元素。 Delay Queue的底层实现是使用了 PriorityQueue+ReentrantLock来实现延迟获取功能。 2.PriorityQueue分析 其中PriorityQueue是种优先级队列,线程不安全,队列中的元素会按照优先级来排序。该队列底层实现是使用二叉堆,并且元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序。因为PriorityQueue中的元素都要进行比较,所以优先级队列中不能拥有null元素,也不能有不能比较的元素。 PriorityQueue的继承关系如下图: PriorityQueue中的属性及构造方法: public class PriorityQueue<E> extends AbstractQueue<E> implements java.io.Serializable { //队列的默认容量 private static final int DEFAULT_INITIAL_CAPACITY = 11; //底层用于存放数据的数组 transient Object[

技术精讲:Java 8 Stream API

[亡魂溺海] 提交于 2019-12-04 22:03:33
Stream(流)是在Java 8中新增的新特性,首先需要为Java 8 Stream正名:Java 8中的Stream跟Java I/O Stream(例如:InputStream,OutputStream等)没有任何的关系。Stream是Java中数据源的包装器,通过Stream我们可以快速的对数据源进行操作(例如:过滤,排序、求和等等),且Stream不对任何数据进行存储,所以Stream也不是数据结构。 ​ 在Java 8中,Stream增强了Array,List等对象操作数据的能力,Stream提供了一些列的方法使的这些原有的集合类可以轻松创建Stream对象实例。通过Stream API提供的静态方法,可以快速的生成有限/无限的数据流。特别指出,Stream只是增强了原有集合类的能力,并未对底层的源码做任何的修改。 1.Stream的工作流程 ​ 接下来,将介绍使用Java Stream的基本步骤。在Java 8中,Stream的生命周期一共有三个阶段: 1.获取数据源并创建Stream实例。数据源可以是数组、列表、对象或者I/O流 2.执行中间操作(Intermediate Operations)。中间操作可以是过滤、排序、类型转换等操作 3.执行终端操作(Terminal Operation)。终端操作主要是对最终结果进行计数、求和、创建新集合等操作 图1

技术精讲:Java 8 Stream API

狂风中的少年 提交于 2019-12-04 21:45:03
Stream(流)是在Java 8中新增的新特性,首先需要为Java 8 Stream正名:Java 8中的Stream跟Java I/O Stream(例如:InputStream,OutputStream等)没有任何的关系。Stream是Java中数据源的包装器,通过Stream我们可以快速的对数据源进行操作(例如:过滤,排序、求和等等),且Stream不对任何数据进行存储,所以Stream也不是数据结构。 ​ 在Java 8中,Stream增强了Array,List等对象操作数据的能力,Stream提供了一些列的方法使的这些原有的集合类可以轻松创建Stream对象实例。通过Stream API提供的静态方法,可以快速的生成有限/无限的数据流。特别指出,Stream只是增强了原有集合类的能力,并未对底层的源码做任何的修改。 1.Stream的工作流程 ​ 接下来,将介绍使用Java Stream的基本步骤。在Java 8中,Stream的生命周期一共有三个阶段: 1.获取数据源并创建Stream实例。数据源可以是数组、列表、对象或者I/O流 2.执行中间操作(Intermediate Operations)。中间操作可以是过滤、排序、类型转换等操作 3.执行终端操作(Terminal Operation)。终端操作主要是对最终结果进行计数、求和、创建新集合等操作 图1

源码之LinkedList 单双向链表介绍

霸气de小男生 提交于 2019-12-04 18:37:09
链表 单向链表 单链表,通俗讲就是只知道下个节点,不知道上个节点,如下图: 单链表的特点: 最后一个节点的next为null(闭环链表指向第一个元素) 只可一个方向遍历 双向链表 双链表,通俗讲就是既知道下个节点,也知道上个节点,如下图: 特点: 最后一个节点的next为null(闭环链表指向第一个元素) 可双向遍历(从头部或者尾部遍历) LinkedList 以下都是基于jdk1.8 LinkedList是一个双向链表结构 实现了List和Deque接口。 所以也实现了List的操作和双端队列的操作,并允许所有元素(包括null ) 迭代操作iterator和listIterator,面对并发修改,迭代器将快速而干净地失败,而不是在未来未确定的时间冒着任意的非确定性行为 父类介绍 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable {} 说明: 继承 AbstractSequentialList ,提供了添加add()、随机访问get()、迭代器、移除remove等方法 实现 List 接口,提供了普通集合类的一些标准方法 实现 Deque