21道并发编程面试题(3)

    线程获取资源,如果资源获取成功则正常运行,如果资源获取失败,就处于阻塞状态,等待什么时候获取到资源再变为运行状态;

  6.4 等待状态 (WAITING):

    线程手动调用了wait()方法,或者join()方法,这些方法都是主动进入等待状态,等待状态会将CPU资源让渡,需要其他线程手动唤醒,notify(),notifyAll()唤起所有的等待线程;

  6.5 超时等待状态 (TIMED_WAITING):

    与等待状态相同,都是主动进入等待,也是需要其他线程唤醒,但是区别在与超时等待,如果超过了等待时间,则自动唤醒;

  6.6 终止状态(DIED):

    线程结束之后的状态;

7.多线程中的常用方法

  7.1 start()方法

    用于启动一个线程,使相应的线程进入排队等待状态。一旦轮到它使用CPU的资源的时候,它就可以脱离它的主线程而独立开始自己的生命周期了。注意即使相应的线程调用了start方法,但相关的线程也不一定会立刻执行,调用start方法的主要目的是使当前线程进入排队等待。不一定就立刻得到cpu的使用权限...

  7.2 run()方法

    Thread类和Runnable接口中的run方法的作用相同,都是系统自动调用而用户不得调用的。

  7.3 sleep()方法

    是Java中Thread类中的方法,会使当前线程暂停执行让出cpu的使用权限。但是监控状态依然存在,即如果当前线程进入了同步锁的话,sleep方法并不会释放锁,即使当前线程让出了cpu的使用权限,但其它被同步锁挡在外面的线程也无法获得执行。待到sleep方法中指定的时间后,sleep方法将会继续获得cpu的使用权限而后继续执行之前sleep的线程。

  7.4 wait()方法

    是Object类的方法,wait方法指的是一个已经进入同步锁的线程内,让自己暂时让出同步锁,以便其它正在等待此同步锁的线程能够获得机会执行。,只有其它方法调用了notify或者notifyAll(需要注意的是调用notify或者notifyAll方法并不释放锁,只是告诉调用wait方法的其它 线程可以参与锁的竞争了..)方法后,才能够唤醒相关的线程。此外注意wait方法必须在同步关键字修饰的方法中才能调用。

  7.5 notify()方法

    唤醒在此对象监视器上等待的单个线程,使其进入“就绪状态”。  

  7.6 notifyAll()方法

    唤醒在此对象监视器上等待的所有线程,使其进入“就绪状态”。

8.线程状态流程图

  

21道并发编程面试题

  新建(new):新创建了一个线程对象。

  可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。

  运行(running):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码。

  阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况分三种:

    等待阻塞:

      运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。

    同步阻塞:

      运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

    其他阻塞:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c628f105a4eead5224f1076e66487750.html