JavaRush /Java 博客 /Random-ZH /第 25 级。有关该级别主题的面试问题的答案
zor07
第 31 级
Санкт-Петербург

第 25 级。有关该级别主题的面试问题的答案

已在 Random-ZH 群组中发布
第 25 级。关于第 1 级主题的面试问题的答案
  1. 对象的所有状态是什么Thread

    • 新的
    • 可运行
    • 封锁
    • 等待
    • TIMED_WAITING
    • 终止
  2. 线程进入块时可以进入什么状态synchronized

    • 可运行
    • 封锁

    在RUNNABLE中,如果标记的代码块synchronized没有被另一个线程占用。否则,我们的线程将收到 BLOCKED 状态并等待互斥对象被释放。

  3. 调用该方法时线程会进入什么状态wait()

    调用此方法会将线程置于 WAITING 状态。
    该方法只能在已被当前线程“锁定”的互斥对象上的wait()块内调用,否则该方法将抛出IllegalMonitorStateException异常。synchronized

    
    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    当一个方法被调用时wait(),当前线程释放该对象的锁monitor并进入WAITING状态,等待另一个线程调用该monitor.notify()方法monitor.notifyAll()。一旦发生这种情况,线程就会醒来,如果监视器不忙,它将抓住它并继续工作。
    如果监视器被另一个线程占用,则当前线程将进入 BLOCKED 状态。

  4. 调用该方法时线程会进入什么状态wait(500)

    调用此方法会将线程置于 TIMED_WAITING 状态。
    与方法类比wait(),它只能在已被当前线程“锁定(locked)”的互斥对象上的wait(timeout)一个块内调用。synchronized

    
    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait(500);}

    当调用该方法时wait(),当前线程释放该对象的锁monitor并进入睡眠状态 500 毫秒。该对象monitor可能被另一个线程捕获。
    500 毫秒后,线程将被唤醒,如果monitor它不忙,它将抓住它并继续工作。
    如果监视器被另一个线程占用,则当前线程将进入 BLOCKED 状态。

    调用该方法时线程会进入什么状态notify()

    
    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    之后 monitor.wait(),线程将进入 WAITING 状态。notify()对象上的另一个线程调用的方法monitor会将线程从 WAITING 状态移至 RUNNABLE 状态,除非监视器对象被另一个线程捕获,否则移至 BLOCKED 状态。

  5. 调用该方法时线程会进入什么状态notifyAll()

    notifyAll()“将留下”所有线程。所有“睡眠”(WAITING)线程之一将进入 RUNNABLE 状态,接管正在使用的对象的监视器并继续其工作。其余的将处于 BLOCKED 状态。一旦第一个“唤醒”线程释放了其他人都在等待的监视器,下一个线程就会重复它的命运(任意线程将从 BLOCKED 状态进入 RUNNABLE 状态)。这将继续,直到所有“唤醒”线程离开 BLOCKED 状态。

  6. 三个线程中的synchronized块称为wait()互斥对象。如果第四个线程调用,这些线程将进入什么状态notifyAll()

    其中两个将进入 BLOCKED 状态,一个进入 RUNNABLE 状态

  7. join(500)它与有何不同wait(500)

    尽管 和join(500)会将wait(500)当前线程转移到 TIMED_WAITING 状态,但它们之间存在显着差异:
    join(500)在线程上调用,wait(500)在该块同步的对象上的同步块内调用。
    调用时,join(500)当前线程将等待 500 毫秒,等待join()调用其方法的线程完成。
    调用时,wait(500)当前线程将释放同步对象的锁并进入睡眠状态 500 毫秒。
    500 毫秒后,这两种情况下线程都将继续工作。

  8. wait(500)它与有何不同sleep(500)

    sleep(500)在线程上调用,wait(500)在同步块内同步该块的对象上调用。
    调用时,sleep(500)当前线程将等待 500 毫秒,然后继续其工作。
    调用时,wait(500)当前线程将释放同步对象的锁并进入睡眠状态 500 毫秒。

  9. 调用该方法时线程会进入什么状态yield()

    当一个方法被调用时yield(),当前线程“跳过它的轮次”,java立即切换到执行下一个线程。线程从一个状态转到running另一个状态ready。运行和就绪状态是 RUNNABLE 状态的子状态。

PS欢迎评论、补充、更正、评论 =)
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION