Concurrency-Thread
线程创建
线程创建有3种方式:
- 继承Thread类
- 实现Runnable接口
- 使用ExecutorSerivce+Callabel+Future实现结果返回的多线程
线程是调度的基本单位,进程是资源分配的基本单位。
线程状态
- NEW 新建
- RUNNABLE/RUNNING 就绪/运行中
- WAITING/TIME WAITING 等待/超时等待
- BLOCKED 阻塞
- TERMINATED 结束
线程调度
线程优先级
Java线程有优先级,优先级高的线程会获得较多的执行机会。
Java线程优先级用1~10的整数表示,使用setPriority()
和getPriority()
方法分别设置和获取线程的优先级。
Thread类中有3中优先级的静态常量:
static int MAX_PRIORITY // 线程可以具有的最高优先级,取值为 10。
static int MIN_PRIORITY // 线程可以具有的最低优先级,取值为 1。
static int NORM_PRIORITY // 分配给线程的默认优先级,取值为 5。
每个线程都有默认的优先级:NORM_PRIORITY。优先级可以被继承,如果A线程中创建B线程,那么A线程和B线程拥有相同的优先级。
线程常用方法
sleep
进入waiting
/time waiting
状态,不释放锁。
join
被调用的线程会被阻塞直到调用线程执行结束。底层是被阻塞线程调用了wait0()
方法。
interrupted
返回当前线程的中断状态;将当前线程的中断状态设为false;打断标记为真时,会让LockSupport.park()失效。
wait
在synchronized块中调用,线程进入waiting
/time waiting
状态,释放锁。
sleep和wait区别
共同点:
- 可以指定线程阻塞的毫秒数。
- 如果线程处于sleep/wait/join状态,此时调用线程的的interrupted方法,会抛出InterruptedException。
不同点:
- sleep属于Thread类方法,wait属于Object类方法。
- sleep不释放锁,wait释放锁
- wait需要在synchronized块中使用
- sleep需要捕捉异常
网友评论