java面试每日三题(4)线程
一、线程相关API
对于线程相关的api也是大家需要熟练掌握的。
1,wait线程等待
调用该方法的线程进入WAITING状态,只有等待另外线程的通知或者被中断才会返回,需要注意的是调用wait方法后,会释放对象的锁,因此,wait方法一般用在同步方法或者同步代码块中。
2,sleep线程睡眠
sleep导致当前线程休眠,与wai方法不同的是sleep不会释放当前占有的锁,sleep会导致线程进入TIMED-WATING状态。
3,yield线程让步
yield会使当前线程让出cpu执行时间片,与其他线程一起重新竞争cpu时间片,一般情况下,优先级高的线程有更大的可能性成功竞争得到cpu时间片,但是不是绝对的,有的操作系统本身就对线程优先级不敏感。
4,interrupt线程中断
中断一个线程,就是给这个线程一个通知,会影响这个线程内部的一个中断标识位。这个线程本身并不会因此改变状态。
5,join等待其他线程终止
在当前线程中调用join方法则当前线程转变为阻塞状态,回到另一个线程结束,当前线程再有阻塞状态变为就绪状态,等待cpu调度。
6,notify线程唤醒
唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则随机唤醒其中一个线程。
二、wait和sleep的区别
wait在等待的过程中会释放锁,wait必须在同步代码块中使用,不需要捕获异常。
sleep在等待过程中不会释放锁,可以在任何地方使用,需要捕获异常。
三、了解线程池
在实际使用中,线程是很占用系统资源的,如果对线程管理不完善的话很容易发生系统问题,使用线程池可以重复利用已有的线程执行任务,可以对线程进行管理和编排。
创建线程的方法分为自动创建和手动创建,自动创建则是通过Executors类名直接调用api创建。手动创建使用new ThreadPoolExecutor,手动创建的优点是可以灵活的设置线程池的参数。
因篇幅问题不能全部显示,请点此查看更多更全内容