9.3、线程生命周期
9.4、常用方法
锁池和等待池的概念:
锁池:所有需要竞争同步锁的线程都会放在锁池当中,如果对象的锁被某一线程得到,此线程会进入就绪队列等待,其他线程需要继续等待。
等待池:调用wait方法后,线程会放在等待池,只有调用notify()[随机从等待池拿出一个线程放到锁池]、notifyAll()[将所有的线程放到锁池中]后才会竞争锁。
线程种常用的方法:
-
sleep():线程睡眠,是类Thread的方法。可以使线程暂时把CPU的权限释放,保持监控状态,当设定时间到期后,从新拿回cpu资源,继续执行。不会释放同步锁,所以即使让出了cpu,其它线程还是得不到锁进行执行。主要用于当前线程休眠或暂停操作
-
wait方法:
- wait():线程等待,调用会释放本地锁,进入等待池,让其他线程获得锁进行执行,只有notify()、not ifyAll()调用才会进入锁池准备获取对象锁。需要依赖synchronized关键字,主要用于多线程之间的通信。
- wait(long timeout):与wait()方法类似,唯一的区别就是在指定时间内,如果没有notify或notifAll方法的唤醒,也会自动唤醒。
-
yield():线程礼让,执行后线程进入就绪状态,释放cpu的执行权,但保留cpu执行资格,所以cpu有可能在下次执行时让此线程继续执行,只是提醒优先将资源给其他线程使用,不一定会生效。
-
线程的优先级:在操作系统中,线程可以划分优先级,线程优先级越高,获得 CPU 时间片的概率就越大,但线程优先级的高低与线程的执行顺序并没有必然联系,优先级低的线程也有可能比优先级高的线程先执行。(低优先级只是获得调度的概率低,并非一定是在高优先级线程之后才被调用)
- getPriority() **:**返回线程优先值
- setPriority(int newPriority) **:**设置线程的优先级
-
join():线程进入阻塞状态,在线程B中调用线程A的join()方法,B会进入阻塞队列,直到A执行结束或中断
-
interrupt():线程中断,中断的时候会抛出异常,必须捕捉
-
notify():线程唤醒,唤醒此对象监视器上等待的一个线程,随机一个
-
notifyAll():唤醒此对象监视器的所有线程
-
start():是用来启动线程的,让线程处于就绪状态,可以执行线程外接下来的代码
-
run():线程体,是线程要执行的内容,当线程进入运行状态,开始执行run内的代码,执行完毕后,线程终止。