Java多线程 - API
2017-05-05 本文已影响95人
yuanzicheng
- Java中创建线程有
4
种方式:实现Runnable
接口、继承Thread
(Thread本身也是Runnable接口的实现类)、实现Callable
接口(可以返回执行结果)、使用Executor
框架; - 线程类的多个实例(即多个线程)中,实例变量是相互独立的;
- 线程类的一个实例(单个线程)作为参数传入多个线程中,实例变量在这些线程中是共享的,但是存在线程安全问题,需要在操作实例变量的方法上加上同步锁
synchronized
; - 获取当前线程的方法:
currentThread()
; - 检查线程是否存活:
isAlive()
; - 使线程阻塞一定时间(ms为单位):
sleep()
; - 获取线程ID:
getId()
; - 中断线程(并不是真正的终止,而是标记):
interrupt()
; - 检查当前线程是否中断(静态方法):
interrupted()
,再次使用会清除中断标记; - 检查线程是否中断:
isInterrupted()
; - interrupt()后sleep()、sleep()后interrupt()均会发生
InterruptedException
异常; - 停止线程:检查是否中断,手动
抛出异常
(推荐,线程停止事件可以向上传播),或return
; - 暴力停止线程:
stop()
,此方法存在线程安全问题,已过时,不建议使用; -
suspend()
方法可以暂停线程,resume()
方法可以恢复暂停的线程,不过这两个方法在jdk1.8中也已经过时了; - 线程执行到synchronized的方法时使用suspend()会引起独占锁问题;
-
yield()
可以令线程释放当前的CPU资源,但释放的时间不确定,有可能释放后又立马获得; - 线程存在优先级1-10,设置优先级的方法为
setPriority()
,超过此范围会抛出异常IllegalArgumentException
,JDK使用3个常量来预定义优先级:MIN_PRIORITY(1)
、NORM_PRIORITY(5)
、MAX_PRIORITY(10)
; - 线程的优先级具有继承性:如线程A启动线程B,则线程A、B的优先级相同;
- 线程的优先级具有规则性:高优先级的线程总是大部分先执行完,优先级差距越大越明显,但不代表高优先级的线程全部先执行完;
- 线程的优先级具有随机性:优先级较高的线程并不一定每一次都先执行完run()方法中的任务;
- Java线程分为:
守护线程
和用户线程
,方法setDaemon()
可以标记线程是否守护线程,当前运行的所有线程为守护线程时,JVM会结束工作。