线程中断interrupt
以下内容完全来自于《java核心技术卷Ⅰ 》
当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。在Java的早期版本中,还有一个stop方法,其他线程可以调用它终止线程。但是,这个方法现在已经被弃用了。
有一种可以强制线程终止的方法。然而, interrupt方法可以用来请求终止线程。
当对一个线程调用interrupt方法时线程的中断状态将被置位。这是每一个线程都具有的boolean标志。每个线程都应该不时地检查这个标志,以判断线程是否被中断。
要想弄清中断状态是否被置位,首先调用静态的Thread.curr
2018-05-31
java并发
Java不可变对象
定义:如果某个对象在被创建后,其状态(实例变量)不能被修改,那么这个对象就称为不可变对象。
优点:
不可变对象一定是线程安全的(不可变,别的线程修改不了)。
可作为Map的键值和Set的元素。
编写不可变类:
所有字段都是private final。
没有任何public的方法来修改字段。
不依赖外部可变对象的引用。(如果依赖外部可变对象,那么当外部可变对象修改时,引用变量会指向新的对象,违反不可变对象的定义)
不能逸出任何可变对象的引用变量。(逸出引用变量后,外部可以通过引用变量修改对象)。import java.util.Date;
public final class I
2018-05-29
Java
AVL树
参考:https://www.cnblogs.com/skywang12345/p/3577479.html
AVL树本质上还是一棵二叉搜索树,它的特点是:1.本身首先是一棵二叉搜索树。2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。也就是说,AVL树,本质上是带了平衡功能的二叉查找树(二叉排序树,二叉搜索树)。
以下为四种不平衡的临界条件,分别为LL(leftleft),LR(leftright),RL,RR。当每次到达这四种不平衡的临界条件时,都进行旋转树操作,那么树就能维持平衡:
private AVLTreeNode leftLeftRotation(AVL
2018-05-27
算法
二叉树前序、中序、后序遍历,和直观打印。
//前序遍历
public static void preOrderedPrint(TreeNode root){
if (root!=null){
System.out.print(root.value);
preOrderedPrint(root.leftNode);//删去了多余的if(root.leftNode!=null)的条件判断。
preOrderedPrint(root.rightNode);
}
}
//中序遍历
public static void inOrderedPrint(TreeNode root){
2018-05-27
算法
HashMap半解析
此篇文章是对源码的分析,但并没有贴大量源码。3个接口前两个就不用多说了,Map<K,V>接口也应该对着中文版api文档看一下就明白了。
先看直接父类AbstractMap<K,V>:
AbstractMap<K,V>内部类:
SimpleEntry<K,V>:实现Entry接口,Entry的英文单词是条目的意思,接口里面都是一些对规定好的操作方法,看文档就行了。在类中只有final key和value两个字段,其中由于key是final的,因此初始化之后就不可变。实例方法都是对这两个变量的基本操作,没什么特别的。简单来说就是对key和value的
2018-05-27
Java
线程生命周期和同步监视器是什么
###线程生命周期新建:Thread thread=new Thread();,用new关键字创建一个线程后,构造方法中将当前thread对象加入ThreadGroup,虚拟机为其分配内存。就绪:调用线程实例的start(),JVM为其创建方法调用栈和程序计数器,线程何时开始运行取决于JVM里线程调度器的调度。阻塞:如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则该线程处于运行状态,如果计算机只有一个CPU,那么在任何时刻只有一个线程处于运行状态。当然,在一个多处理器的机器上,将会有多个线程并行执行;当线程数大于处理器数时,依然会存在多个线程在同一个CPU上轮换的现象。当
2018-05-21
java并发