线程的优先级
- Java 采用的是抢占式的 cpu 调度方式(有些系统采用的是平均式的 cpu 调度系统)
- 因此需要对线程设置优先级来抢占 cpu 的时间片
- java 线程的优先级只有三种常量,不能随意更改,只能在
1-10
范围内。 t.setPriority();
更改线程优先级t.getPriority()
获取线程优先级- 线程的优先级高,只能代表他获得 cpu 时间片的几率比较大,并不能保证他最先执行
线程的阻塞和等待
- 阻塞或等待的线程几乎不消耗资源
- 当一个线程企图获得一个资源对象的锁;而这个资源正被其他线程占有,当前线程就会阻塞
- 通过下面方法的调用可以让线程进入(计时等待状态):
-
static void sleep(long millis)
: 使正在进行的线程停留指定的毫秒数 -
void join()
:等待终止指定的线程。-
也就是:让主线程等待子线程的终止。
-
主线程的代码块中,如果碰到了
t.join()
方法,此时主线程需要等待(阻塞),等待子线程结束了(Waits for this thread to die.),才能继续执行t.join()
之后的代码块。 -
join()
方法一共有三个重载,都被final
修饰,无法被子类重写。 -
join() = join(0)
代表主线程会一直等,直到子线程结束 -
join()
方法中调用了wait()
方法 -
join()
和sleep()
一样,可以被中断(被中断时,会抛出InterrupptedException
异常);不同的是,join()
内部调用了wait()
,会出让锁,而sleep()
会一直保持锁。
-
-
join(long mills)
:等待mills
个毫秒,这是join()
方法的重载 -
Thread.State.getState()
:获取当前线程的状态
-
线程守护
-
当主线程结束的时候,守护主线程的线程都会结束。
-
Thread.currentThread()
获取当前的主线程
-
void setDaemon(boolean on)
: 将该线程标记为守护线程,当运行的线程都是守护线程的时候,java 虚拟机退出。
线程的生命周期
线程的中断
- 线程如果在等待或者被阻塞,可以通过在 “被阻塞的线程上” 调用
interrupt()
方法,这时候,这个阻塞将会被一个interruptedException
异常中断。 - 线程被中断并不代表这个线程应该被终止,因为线程可以有处理中断的行为
- 内中断就是异常(interruptedException)
- 外中断通常指设备终端:比如磁盘中断,打印机中断