进程与线程的对比
线程的创建方式⭐
继承Thread类
实现Runnable接口
实现Callable类
适用于需要获取返回值的线程。
线程池创建线程
Callable与Runnable的区别
1. 首先Runnable的run方法是没有返回值的,Callable的call方法有返回值。
2. Runnable不能向外抛出异常,Callable可向外抛出异常。
run()与start()方法的区别
start()方法是开启一个线程,来执行run()方法,start()方法只能被调用一次。run()方法封装了线程执行的代码,可调用多次。
Thread类中的线程的状态
新建、可执行、死亡、阻塞、等待、计时等待(后三个可都叫做阻塞态)。
状态的转换
通过new方法产生一个线程a,a为新建状态。a调用start()方法后变为可执行状态,当a执行完成后进入死亡状态。假如a需要竞争一把锁,如果没有获取到锁,则a处于阻塞态(资源竞争导致)。当调用wait()方法后,a进入等待状态,调用notify方法后,a进入执行态。使用sleep()方法后,a进入计时等待状态。
多线程之间的顺序执行
多线程之间一般是并发执行的。如果需要使线程之间顺序执行,可使用以下方法:
1.join()方法
t1,t2,t3是3个线程,如果希顺序执行可见下图代码:
notify与notifyAll的区别
wait()与sleep()方法的区别⭐
相同点
wait()、wait(long time)、sleep(long time)都可让线程放弃CPU使用权,进入阻塞态。
不同点
方法归属不同:sleep方法是Thread的静态方法。wait()、wait(long time)是Object的成员方法,每个类都有。
唤醒时机不同
wait(long time)、sleep(long time)可以在固定时间后自动唤醒。wait(long time)、wait()只能通过notify唤醒。(wait(long time)有两种唤醒方式)
锁的特性不同
重点是最后两点的对比。