文章摘要:java线程四种状态
Java线程是一个动态执行的过程,有一个从产生到死亡的过程,共五种状态:新建(newThread)—就绪(ru […]
Java线程是一个动态执行的过程,有一个从产生到死亡的过程,共五种状态:新建(newThread)—就绪(runnable)—运行(running)—死亡(dead)—堵塞(blocked)。
Java线程有几种状态
1. 新建(new Thread)。当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)
2. 就绪(runnable)。线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。
3.运行(running)。线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
4. 死亡(dead)。当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止。
异常终止:调用stop()方法让一个线程终止运行。
5. 堵塞(blocked)。由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)。
Java中有哪些不重复的集合
Set:典型实现 HashSet()是一个无序,不可重复的集合
1、Set hashSet = new HashSet();
①HashSet:不能保证元素的顺序;不可重复;不是线程安全的;集合元素可以为 NULL。
②其底层其实是一个数组,存在的意义是加快查询速度。我们知道在一般的数组中,元素在数组中的索引位置是随机的,元素的取值和元素的位置之间不存在确定的关系,因此,在数组中查找特定的值时,需要把查找值和一系列的元素进行比较,此时的查询效率依赖于查找过程中比较的次数。而HashSet 集合底层数组的索引和值有一个确定的关系:index=hash(value),那么需要要调用这个公式,就能快速的找到元素或者索引。
③对于HashSet:如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
2、Set linkedHashSet = new LinkedHashSet();
①不可以重复,有序。因为底层采用链表和哈希表的算法。链表保证元素的添加顺序,哈希表保证元素的唯一性。
3、Set treeSet = new TreeSet();
TreeSet:有序;不可重复,底层使用 红黑树算法,擅长于范围查询。
* 如果使用 TreeSet() 无参数的构造器创建一个 TreeSet 对象,则要求放入其中的元素的类必须实现 Comparable接口,所以在其中不能放入 null 元素。
Map:key-value的键值对,key不允许重复,value可以
1、严格来说Map并不是一个集合,而是两个集合之间的映射关系。
2、这两个集合没每一条数据通过映射关系,我们可以看成是一条数据。即Entry(key,value)。Map可以看成是由多个Entry组成。
3、因为Map集合即没有实现于Collection接口,也没有实现Iterable 接口,所以不能对Map集合进行for-each遍历。
什么是Java标识符
java中的标识符是用户编程时使用的名字,用于给变量、常量、函数、语句块等命名。
Java标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java关键字不能当作Java标识符。命名规范如下:
1、见名知意即可,不要过长。
2、camel,驼峰原则。
3、包的命名:全部小写,多级包用 . 隔开。
4、类||接口:每个单词的首字母大写。
5、方法||变量: 第一个单词全部小写,第二个单词开始,每个单词首字母大写。
6、常量:全部大写,每个单词之间使用**_**进行分割 GUO_WU_YUAN。