集合、异常、多线程笔记
一、集合 1.1 Set集合 1.1.1 Set集合特点 不可存储重复元素 没有索引值,不可以用普通for循环遍历,可以用迭代器和增强for 1.1.2 HashSet集合
1. 不允许存储重复的元素 2. 没有索引,没有带索引的方法,不可以用普通for循环遍历 3.是一个无序集合,存储元素和取出元素的顺序有可能不一致 4.底层是一个哈希表结构(查询速度快)哈希表:数组 + 链表或红黑树 1.1.3哈希值
哈希值是一个十进制数值,一般是通过将该对象的内部地址转换成一个整数来实现的 public nativeint hashCode(); 可以调用系统本地代码(C++)计算为一个哈希值 hashCode()方法的作用 方法内部的算法用于将对象计算为一个哈希值,便于根据哈希值比较对象是否“相等” 哈希值主要是为了提高对象存储在 哈希表 中的效率 注意事项: 如果我们不满意Object中的哈希值计算方法,可以重写hashCode()方法 但在java代码中不能直接重写带有native 的方法,重写时应该将 native 去掉 不同元素的哈希值有可能一样,所以通过hashCode和equals方法来判断元素是否一样 1.1.4 LinkedHashSet集合 特点:底层增加了一条链表,存储元素有序,并且不能存储一样的元素。 1.1.5 总结
什么时候用list,什么时候用Set: 要存储的元素可以重复,用List集合: 增删少,用ArrayList 增删多,用LinkedList 要存储的数据要求不重复,或者相对一个集合去重,用Set集合: 不要求存取顺序一致,用HashSet 要求存取顺序一致,用LinkedHashSet 1.1.6 可变参数
·定义:JDK 5 出现,指同一个类型参数个数可变的参数 可变参数的本质是一个“数组” 使用前提: 当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数 格式:用在方法的参数中 修饰符 返回值类型 方法名(参数类型... 变量名){ //可以直接将 变量名 当作 数组名 使用 } 注意事项: a. 可变参数可以传递的参数个数,可以是 0个,1个,多个 b. 一个方法的参数列表中,只能有一个可变参数 c.如果方法的参数有多个,可变参数必须写在参数列表的最后 1.1.7 Sort排序
·格式: public static<T> void sort(List<T> list):将集合元素按照默认规则排序。 注意事项: sort(List<T>list)使用前提 被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法comporeTo定义排序的规则 Comparable接口的排序规则:自己(this)- 参数:升序。 1.1.8 Comparable接口和Comparator接口区别:
·Comparable:让JavaBeen自身具有可比较性(自己和其他人比) ·Comprator:定义一个比较器类,同比较器对象比(让第三个人来帮两个人比较) Comparator使用方式: 定义类作为比较器,实现Comprator接口,重写int compare(E o1,E o2)方法,泛型为要比较的元素的类型,在Collections.sort(List<T> list,Comparator<?super T>)方法中传入自定义比较器对象 规则:o1 - o2:升序;o2 - o1:降序 2、List集合 1.2.1 List集合特点
1. 元素存取有序(存入和取出元素的顺序一致) 2.元素可以重复 3. 有索引 List子体系中的实现类都具有上述特点,所有集合都要注意越界异常 1.2.2 List接口常用方法
· void add(intindex,E element):将指定元素添加到集合中的位置 ·E get(int index):返回集合指定位置的元素 ·E remove(intindex):移除列表指定位置的元素,返回的是移除的元素 ·E set(intindex,E element):指定元素替换集合中指定位置的元素,返回值是更新前的元素 1.2.3 ArrayList集合
· ArrayList集合特点: 底层是数组结构 查询快,增删慢,线程不安全,效率高。 1.2.4 LinkList集合
·特点: 底层数据结构是链表 增删快,查询慢,线程不安全,效率高 ·常用方法: void addFitst(Ee):将指定元素插入此列表的开头 void addLast(Ee):将指定元素添加到列表末尾。 E getFirst():返回此列表第一个元素。 E getLast():返回此列表最后一个元素。 E removeFirst():移除并返回此列表的第一个元素 E removeLast():移除并返回此列表的最后一个元素 E pop():等效于removeFirst(),从此列表栈中弹出一个元素 void push(E e):等效于addFirst(),将元素添加此列表所表示的栈中。 二、数据结构 2.1 定义
数据结构:数据的存储方式 不同的数据结构代表了不同的存储方式 不同的数据结构中,会有不同的存入,取出,查找的方式和效率,数据的存放方式也不同。 2.2栈
定义:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其它任何任何位置进行添加、查找、删除等操作。 · 简单的说:采用该结构的集合,对元素的存取又如下的特点 先进后出(FILO):存进去的元素,要在后它后面的元素依次取出后,才能取出该元素。例如:子弹压进弹夹。 栈的入口、出口都是在栈的顶端位置。 2.3队列
队列特点: 先进先出(FIFO,First In First Out) 入口和出口在两端 队列应用场景: 2.4 数组
·数组Array是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素,就好比出租屋,每个屋子都有固定的编号。 ·结构特点: 查找元素快:可以快速访问到指定位置的元素 增删元素慢:指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,在把原数组元素根据索引,复制到新数组相对应的索引位置。 2.5链表 链表:linked list,由由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个时存储数据元素的数据域,另一个时存储下一个终点地址的指针域。链表分为 单向链表和双向链表 链表的特点: 多个结点之间,通过地址进行连接,例如手拉手 查找元素慢:想查找某个元素,需要通过连接的节点,依次查找指定元素 增删元素快:只需要修改连接下个元素的地址即可 2.6.红黑树
定义:是一种 平衡 二叉 查找 树 红黑树特点: 元素存储过程中就是完成了大小排序 查询比链表快,增删比数组快(数组和链表折中) 适用场景: 查询和增删都有,需要元素自动排序的场景 讲解图:
三、Map双列集合 3.1 Map集合的特点:
Java.util.Map<K ,V>接口 1.是双列集合,一个元素包含两个值(键Key, 值value) 2.key和value的类型可以相同,也可以不同 3.key不允许重复,value可以重复 4.key和value是一一对应的,一个键只能对应一个值 Map集合适合存储一对一关系的数据
java.util.Map<K, V>接口: 双列集合的根接口, 规定了共性的方法 | |_ HashMap<K, V>类: 底层哈希表.key存取无序不可重复 |_ LinkedHashMap类: 底层哈希表+链表. key存取有序不可重复 映射: 键和值的对应关系 mapping HashSet底层使用的就是HashMap LinkedHashSet底层使用的就是LinkedHashMap 3.2 HashMap集合的特点:
1.HashMap集合底层是哈希表,查询的速度特别快 JDK1.8之前:数组+单向链表 JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度 2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致 Java.util.LinkedHashMap<k ,v>集合 entends HasMap<k , v>集合 1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序) 2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的 3.3 常用方法 3.3.1 put方法
Public V put(K key, V value):把指定的键与指定的值添加到Map集合中 返回值:v 存储键值对的时候:key不重复,返回值v是null 存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
3.3.2 remove方法
Public V remove(Object key):把指定的键所对应的键值元素 在Map集合中删除,返回被删除的元素 返回值:v key存在,v返回被删除的值 key不存在,v返回null
3.3.3 get方法
Public V get(Object key)根据指定的键,在Map集合中获取对应的值 返回值v: key存在,返回对应的value值 key不存在,返回null
boolean containskey(Object key)判断集合中是否包含指定的键 包含返回true,不包含返回false
3.3.4Map常用方法概览
Entry键值对对象 K getKey():获取entry对象中的键 V getValue():获取entry对象中的值 Entry对象就是一个节点, 节点中存储了key和value 拿到一个Entry对象就可以从中获取key和value 3.4 Map集合第一种遍历方式 3.4.1 KeySet()
通过键找值的方式 Map集合中的方法: Set<K> keySet()返回此映射中包含的键的Set视图 实现步骤: 1.使用Map集合中的方法KeySet(),把Map集合所有的key取出来,存储到一个Set集合中 2.遍历set集合,获取Map集合中的每一个Key 3.通过Map集合中的方法get(key),通过key找到value 3.5 Map集合第二种遍历方式 3.5.1 entrySet()
1. Map对象调用 entrySet() 获取包含所有Entry对象的Set集合 2. 遍历Set集合,获取每个Entry对象 3. 调用Entry对象的 getKey() 和 getValue() 方法获取键和值
3.6 HashMap 3.6.1 定义
HashMap存储自定义JavaBean对象作为key保证key唯一不重复, 需要让JavaBean重写 hashCode() 和 equals() 方 法 HashTable java.util.Hashtable<k ,v>集合 implements Map<K , V>接口 Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢 HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快 HashMap集合(之前学的所有集合):可以存储null值,null键 Hashtable集合不能存储null值,null键 Hashtable集合是一个唯一和IO流相结合的集合
3.7 JDK9的新特性:
List接口,Set接口,Map接口:里面增加了一个静态的方法of,可以给集合一次性添加多个元素 Static <E> list<E>of (E….elements) 使用前提: 当集合中存储的元素的个数已经确定了,不在改变时使用 注意: 1.of方法只适用于list接口,Set接口,Map接口,不适用于接口的实现类 2.of方法的返回值是一个不能改变的集合,集合不能在使用add,put方法添加元素,会抛出异常 3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则就抛出异常
3.8 Hashtable和HashMap对比
相同点: 底层都是哈希表 不同点: 1.Hashtable不允许存储null值和null键;HashMap允许存储null值和null键 2.Hashtable线程安全线率低;HashMap线程不安全效率高 Hashtable目前很少使用 四、异常 4.1异常的概念和体系
异常: 指的是程序在执行过程中, 出现的非正常的情况,最终会导致JVM的非正常停止
注意:
在Java中, 每种异常都有对应的类来描述, 发生了一个异常, 就是出现了这个类的对象
异常不是语法错误 // 异常信息详解:
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
01
02
03
04
05
06
07
08
09
10
| Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at com.itheima.practice_08.MapTest.main(MapTest.java:31)
解释:
Exception in thread "main": 在名为"main"的线程发生异常
java.util.ConcurrentModificationException: 异常的具体类型, 这里是并发修改异常
at xxx.xxx.xxx: 异常发生的位置, 因为层层方法调用, 所以会出现多个类的方法, 这些方法组成了异常链
只要不是我们的包名, 一般不用看. 是我们的包名, 才看
at com.itheima.practice_08.MapTest.main(MapTest.java:31):
|
说明这个异常, 发生在com.itheima.practice_08下的MapTest类的main方法中, 具体是
MapTest.java文件中的第31行
一般 (MapTest.java:31) 这一部分是可以鼠标点击的, 点击后就直接跳转到报错的这一行
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itheima.practice_01.ExceptionTest.main(ExceptionTest.java:9)
解释:
/ by zero: 是异常的说明信息, 有的异常有说明信息,有的没有
其他和上例一样
4.2异常的分类4.2.1 编译时异常
编译时期就会发生的异常,必须在编译时期处理 4.2.2 运行时异常:
编译时正常, 运行时才会发生的异常 4.2.3异常产生的过程
1. 当执行的代码发生异常操作时, JVM会创建一个对应的异常类对象, 包含异常的内容, 原因, 位置
如 new ArrayIndexOutOfBoundsException(), newNullPointerException()
2. 如果执行代码的方法没有对异常进行 try...catch 处理, 则会向该方法调用处的方法抛(向上层抛).如果所
有方法(包括main()方法)都没有 try...catch 处理异常, 则该异常会被JVM按照默认的处理方式处理
3. JVM对于异常的默认处理方式是:
1. 将异常信息(内容, 原因, 位置)打印到控制台
2. 终止当前的程序 示例: [AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
| int result = divide(2, 1); // 2
try {
int result1 =divide(2, 0); // -1
}catch(){
// 处理异常
记录到日志中(文本文件)发邮件
对于用户: 弹窗提示:"网络繁忙"
} d
ivide(-1, 1); // -1
// 计算两个整数相除的结果
public static int divide(inta, int b) {
if (b== 0) {
// 通知方法调用者
// return -1; // 表示b传递错误
创造一个异常对象
} r
eturn a / b;
}
|
异常的处理方式1:throws声明抛出异常 throws如何处理异常
throws写在哪里, 格式是什么, 作用是什么
提前了解IO用到的一些异常类名:
FileNotFoundException: 文件找不到时抛出的异常
IOException: 只要是IO操作的异常都属于该异常, 是FileNotFoundException的父类 异常处理方式2: 捕获异常 try...catch:
捕获并处理异常 (方法内部自己处理异常, 不交给别人) [AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
01
02
03
04
05
06
07
08
09
10
11
| try {
// 可能产生异常的代码
}catch(异常类名 变量名) {
// 处理异常的代码
// 一般会将异常信息存储到日志中
} .
..
} catch (异常类名 变量名){
// 处理异常的代码
// 一般会将异常信息存储到日志中
}
|
Throwable中的3个异常处理方法: String getMessage(): 异常的信息. 没有原因返回null
String toString(): 异常的类型和原因信息
void printStackTrace(): 使用标准错误输出流打印异常信息 finally代码块: 格式:
[AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
| try {
// 可能发生异常的代码
} catch(异常类型 异常变量名) {
// 处理异常
} finally {
// 无论是否发生异常, 是否捕获, 最后都会执行的代码.
// 通常在这里执行释放资源的操作
}
|
4.3异常注意事项:
子父类继承重写方法时的异常要求子父类继承关系下,子类重写父类带有throws的方法, 有什么要求:
子父类继承关系下, 子类重写父类带有throws的方法
1. 如果父类抛出多个异常, 子类重写父类方法时可以有3种方式:
a: 抛出和父类相同的异常
b: 抛出父类异常的子类
c: 不抛出异常
2. 父类方法没有抛出异常, 子类重写父类该方法时也不可抛出异常
此时子类产生该异常, 只能捕获处理, 不能声明抛出
父类异常时什么样,子类异常就什么样 五、多线程 5.1并反与并行 5.1.1并发
(交替执行) 指两个或多个事件在"同一时间段内"发生 5.1.2并行
(同时执行) 指两个或多个事件在"同一时刻"发生 (同时发生) 5.2进程
内存中运行的一个应用程序
每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程
进程也是程序的一次执行过程,是系统运行程序的基本单位
系统运行一个程序即是一个进程从创建、运行到消亡的过程
5.3 线程
是进程内的一个独立执行单元 (一条代码执行路径)
一个程序运行后至少有一个进程, 一个进程中可以包含多个线程 5.3.1线程的调度
多个线程要并发执行, 哪个线程被执行, 哪个线程不被执行, 就是调度
线程的调度有哪些方式
Java使用的是哪种线程调度方式 5.3.2主线程
主线程:
我们以前编写的代码, 也在一条线程中执行, 该线程叫作"main线程", 也称为"主线程"
如果我们没有额外创建线程, 那么我们的程序就只有一个线程, 即主线程, 此时程序是"单线程"的
单线程的执行特点:
同一个线程内的代码, 从上往下依次执行 创建多线程程序的第一种方式: 继承Thread类 5.4 实现多线程的第一种方式
1. 定义类, 继承Thread类
2. 重写run()方法, run方法内部是线程要执行的任务
3. 创建Thread子类的对象, 调用start()方法启动线程
java.lang.Thread类: 表示线程. 实现了Runnable接口
void start(): 启动线程, 即让线程开始执行run()方法中的代码 5.5多线程 5.5.1原理1
线程执行的随机性 CPU执行哪个线程是随机的, 不能人为干预 Java线程调度是抢占式的, 多个线程互相抢夺CPU的执行权 5.5.2原理2
多线程的内存 多线程情况下, 每个线程都有各自的栈内存 每个线程各自的方法调用, 进的是各自线程的栈 栈是每个线程各自的, 堆是所有线程共用的 5.6创建多线程的方式 5.6.1多线程方式一
继承Thread类 定义类继承Thread 重写run()方法, 要执行的任务 创建子类的对象, 调用start()方法启动线程 5.6.2Thread常用方法
java.lang.Thread类: 表示线程. 实现了Runnable接口 // 构造方法 Thread(): 创建Thead对象 Thread(String threadName): 创建Thead对象并指定线程名 Thread(Runnable target): 通过Runnable对象创建Thread对象 Thread(Runnable target, String threadName): 通过Runnable对象创建对象并指定线程名 // 成员方法 void run(): 用于让子类重写, 表示该线程要执行的任务.不能直接 调用 void start(): 启动线程, 即让线程开始执行run()方法中的代码 String getName(): 获取线程的名称 void setName(String name): 设置线程名称 // 静态方法 static Thread currentThread(): 返回对当前正在执行的线程对象 的引用 static void sleep(long millis): 让所在线程睡眠指定的毫秒 java.lang.Thread类: 表示线程. 实现了Runnable接口 // 构造方法 Thread(String threadName): 创建Thead对象并指定线程名 // 成员方法 void setName(String name): 设置线程名称 Thread常用方法: sleep() java.lang.Thread类: 表示线程. 实现了Runnable接口 // 静态方法 static void sleep(long millis): 让所在线程睡眠指定的"毫秒 5.6.3多线程方式二
实现Runnable接口 1. 定义类, 实现Runnable接口 2. 重写 run() 方法 3. 创建Runnable实现类对象 4. 创建Thread类对象, 在构造方法中传入Runnable实现类对象 5. 通过Thread对象调用start()方法启动线程 java.lang.Thread类: 表示线程. 实现了Runnable接口 // 构造方法 Thread Thread(Runnable target): 通过Runnable对象创建 Thread对象 Thread Thread(Runnable target, String threadName): 通过 Runnable对象创建对象并指定线程名 Thread和Runnable的区别 1. 避免单继承的局限性 2. 增强了程序的扩展性, 降低了程序的耦合性(解耦) 线程是Thread, 任务是Runnable实现类对象. 相当于将线程和任 务分离 5.6.4 匿名内部类方式创建线程[AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
01
02
03
04
05
06
07
08
09
10
11
| public class Test {
public static void main(String[] args) {
// 匿名内部类方式
new Thread(new Runnable(){
@Override
public void run() {
// 要执行的任务
}
}).start();
}
}
|
六、同步 6.1线程安全问题
问题发生场景: 多个线程操作共享资源 问题发生原因: JVM是抢占式调度, CPU在每个线程之间切换是随机的, 代码执 行 到什么位置是不确定的 在操作共享资源时, 由于一个线程还没有执行完, 另一个线程就 来 操作, 就会出现问题 如何解决: 在操作共享资源时, 让线程一个一个来执行, 不要并发操作共享 变 量, 就可以解决问题 6.2解决线程安全问题方式 6.2.1方式1:同步代码块
解决多线程操作共享数据的安全问题的3种方式: 同步代码块: 使用 synchronized 关键字修饰的代码块, 并传入一个 当作锁的对象 格式: [AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
| synchronized (锁对象) {
// 操作共享数据的代码
}
|
注意: 锁对象可以是任意类型的一个对象 锁对象必须是被多个线程共享的唯一对象 锁对象的作用: 只让一个线程在同步代码块中执行 6.2.2同步技术解决线程安全问题的原理
同步的原理: 线程进入同步代码块前, 会争夺锁对象, 只有一个线程会抢到锁对 象 进入同步代码块的线程, 会持有锁对象, 并执行同步代码块中的代 码 此时同步代码块外的线程, 处于阻塞状态, 只能等待 当同步代码块内的线程执行完代码块, 会离开同步代码块, 并归还 锁对象给同步代码块 等在同步代码块外的其他线程就可以继续争夺锁对象 6.2.3方式2: 同步方法 使用 synchronized 关键字修饰的方法, 具有默认的锁对象 非静态同步方法的锁对象: this // 非静态同步方法 [AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
| public synchronized void method(){
// 可能会产生线程安全问题的代码
}
//静态同步方法
public static synchronized void method(){
// 可能会产生线程安全问题的代码
}
|
静态同步方法的锁对象: 当前类的字节码对象 获取一个类的字节码对象的3种方式: 1. 对象.getClass() 2. 类名.class 3. Class.forName("类的全路径"); 6.2.4方式3: Lock锁
java.util.concurrent.locks.Lock接口: JDK 5 新增的Lock接口 // 成员方法 void lock(): 获取锁 void unlock(): 释放锁 java.util.concurrent.locks.ReentrantLock类: Lock的实现类 使用方式: [AppleScript] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important][color=white !important]?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
| public class RunnableImpl implements Runnable {
// 成员变量创建锁对象, 该锁对象也要所有线程共享唯一一个
Lock lock = new ReentrantLock();
@Override
public void run() {
// 加锁
lock.lock();
try {
// 操作共享变量的代码...
} finally {
// 在finally中保证释放锁
lock.unlock();
}
}
}
|
6.3线程的状态
线程的生命周期中, 可以出现有6种状态: 1. NEW 新建 线程被创建, 但没有调用 start() 启动 2. RUNNABLE 可运行 调用 start()方法后已启动, 但可能正在执行 run() 方法的代码, 也 可能正在等待CPU的调度 3. BLOCKED 阻塞 线程试图获取锁, 但此时锁被其他线程持有 4. WAITING 无限等待 通过锁对象调用无参的 wait() 进入此状态. 等待其他线程通过锁对象执行 notify() 或 notifyAll()才能结束这 个状态 5. TIMED_WAITING 计时等待 如通过锁对象调用有参的 wait(long millis) 或 sleep(longmillis), 则进入此状态. 直到时间结束之前被其他线程通过锁对象执行notify()或notifyAll() 唤醒, 或时间结束自动唤醒 6. TERMINATED 终止 run()方法结束(执行结束, 或内部出现异常), 则进入此状态
6.4 Object类中wait(long timeout)和notifyAll()方法
ava.lang.Object类: // 成员方法 (只能通过"锁对象"调用) void notifyAll(): 唤醒所有在同一个锁对象上处于等待状态的线程 void wait(long timeout): 让当前线程处于计时等待状态,时间到 或被唤醒后结束此状态
七、线程、同步常用API
java.lang.Thread类: 表示线程. 实现了Runnable接口 Thread Thread(): 创建Thead对象 Thread Thread(String threadName): 创建Thead对象并指定线程名 Thread Thread(Runnable target): 通过Runnable对象创建Thread对象 Thread Thread(Runnable target, String threadName): 通过Runnable对象创建对象并指定线程名 // 成员方法 void run(): 用于让子类重写, 表示该线程要执行的任务.不能直接调用 void start(): 启动线程, 即让线程开始执行run()方法中的代码 String getName(): 获取线程的名称 void setName(String name): 设置线程名称 // 静态方法 static Thread currentThread(): 返回对当前正在执行的线程对象的引用 static void sleep(long millis): 让所在线程睡眠指定的毫秒 java.lang.Object类: // 成员方法 (只能通过"锁对象"调用) void notify(): 随机唤醒在同一个锁对象上的某一个处于等待状态的线程 void notifyAll(): 唤醒所有在同一个锁对象上处于等待状态的线程 void wait(): 让当前线程处于无限等待状态 void wait(long timeout): 让当前线程处于计时等待状态,时间到或被唤醒后结束此状态 void wait(long timeout, int nanos): 让当前线程处于计时等待状态, 时间到或被唤醒后结束此状态
|