【多线程基础专题】20、关于Java线程的一些关键字问题

本问题对应的项目链接:高频题回答模版训练

说明:这里主要是针对 Java 的一些具体问题,比如如何创建线程,以及这些sleep, wait-notify等等,这些一般面试问的会少一些,并且问的时候比较简单,就问下改变,不会有连环炮啥的。

1、在 Java 中,一个线程的生命周期有哪些?

2、在 Java 的中,创建线程的方式有哪些?

3、你觉得Thread类和Runable接口的最大区别是什么?

4、说一说run() 方法和 start() 的区别?

5、说一说 wait和sleep的区别?

6、说一说 notify 和 notifyAll 的区别以及使用场景?

上面这些没啥好说的,最好可以自己简单使用一些,相对问的少一些

共以下 6 个回答

  • 終达·斯维达尼亚 永久会员 2024年2月22日 上午2:30

    1、在 Java 中,一个线程的生命周期有哪些?

    在JAVA中,线程的生命周期分为六个阶段

    • 初始状态:线程已经被创建但是还未调用start方法
    • 运行状态:包括正在运行和等待分配内存的阶段
    • 无限期等待:必须要被主动唤醒才能继续运行
    • 有限期等待:经过一定时间后自动被唤醒
    • 阻塞状态:被其他线程临时阻塞,常见于等待锁的释放
    • 终止状态:线程已经执行完毕

    2、在 Java 的中,创建线程的方式有哪些?

    可以用过继承Thread类和实现Runable接口,然后重写他们的run方法来创建

    3、你觉得Thread类和Runable接口的最大区别是什么?

    Runnable 是一个接口,Thread 是一个实现了 Runnable 接口的类。按照 Java 中的单继承、多实现的特性,如果使用继承 Thread 类来创建进程,则无法再继承其他类,会降低代码的灵活性。这时用实现 Runnable 接口比较好。

    4、说一说run() 方法和 start() 的区别?

    run方法和start方法都是使线程运行,但是run方法是使使用目前的系统线程来执行run方法中的逻辑,而start方法是创建一条新线程来执行逻辑。

    5、说一说 wait和sleep的区别?

    wait是Thread类的方法,sleep是Object 类的方法。wait方法会释放已经占有的资源,而sleep不会释放。

    6、说一说 notify 和 notifyAll 的区别以及使用场景?

    notify是随机唤醒一个wait状态的线程去锁池竞争,而notifyAll是将所有wait状态的线程都唤醒去锁池。在生产-消费模型中,生产者生产出消息时,可以调用 notify( ) 通知消费者消费。当多个线程需要同时满足某个条件才能运行时,可以使用 notifyAll( ) 唤醒所有等待线程,同时执行任务。

    0 赞同 0 条回复
  • Everglow 永久会员 2023年11月17日 上午1:10

    1、在 Java 中,一个线程的生命周期有哪些?

    在刚创建一个线程也就是new Thread的时候,线程处于new状态。调用strat()方法时线程处于Runnable状态,Runnable状态又可以分为Ready和Running Running指该线程已经占用cpu资源正在执行,Ready指的是该线程已经准备完毕等待操作系统的调度执行。在执行过程中进入synchronized方法或代码块失败后就会进入Blocked状态,如果成功进入到synchronized修饰的临界区内后调用wait方法就会进入waiting或是timed_waiting状态,最后线程执行完任务,也就是执行完run方法内的代码,就会进入temerinated状态结束了线程的生命周期

    2、在 Java 的中,创建线程的方式有哪些?

    一种方式就是线程和任务合并,也就是继承Thread类,重写run方法

    第二种方式就是线程和任务分离,通过实现Runnable接口来重写run方法,创建线程时通过构造函数把任务对象传递给线程对象中

    线程和任务分离可以提高代码的复用性,并且由于java是单继承的,如果有一个类继承了Thread,其他类就无法再继承Thread。

    还有一种方式也是线程与任务分离,通过实现Callable接口重写call方法,比起重写run方法,call方法是有返回值的,也就是可以获取线程执行完任务后产生的结果,但是Thread并不接受Callable类型的任务,需要给它包装成FutureTask类型传递给Thread,FutureTask实现了Runnable接口,还继承了Future接口,可以通过get方法获取到返回值

    3、你觉得Thread类和Runable接口的最大区别是什么?

    Thread对应的是线程的实体类,Runnable对应的是线程执行的任务,java的单继承导致只有一个类能继承Thread,但是可以有多个类同时实现接口

    4、说一说run() 方法和 start() 的区别?

    run方法只是普通的一个方法,调用run方法只是在当前线程的方法栈中新创建一个栈帧,调用start方法是创建一个新的线程并在自己的方法栈中执行run方法

    5、说一说 wait和sleep的区别?

    wait是Object类中的方法,只有一个线程进入到synchronized修饰的临界区的时候才可以调用,调用后释放当前占有的锁,并进入等待队列,线程进入waiting或timed-waiting状态,只有通过notify或notify all来唤醒该线程重新获取锁资源并在wait方法后继续执行。

    sleep是Thread类的静态方法可以在任意处调用,调用后使线程进入timed-waiting状态,并在指定时间后继续执行。

    6、说一说 notify 和 notifyAll 的区别以及使用场景?

    notify会随机选择等待队列中的一个线程唤醒,而notifyAll会唤醒所有线程,虽然最终只能有一个线程进入临界区,但是notify就可能会导致有些线程一直不会被唤醒

    0 赞同 0 条回复
  • LilyBoy 永久会员 2023年9月14日 上午2:43

    1、在 Java 中,一个线程的生命周期有哪些?
    创建状态、就绪状态、阻塞状态、等待状态、等待运行状态、死完状态

    2、在 Java 的中,创建线程的方式有哪些?
    线程池、Thread类、Runnable接口

    3、你觉得Thread类和Runable接口的最大区别是什么?
    实现资源共享。
    一个是接口(多个类可以实现Runnable接口)、一个是类(单继承)、

    4、说一说run() 方法和 start() 的区别?
    – 调用start()方法会创建一个新的子线程并启动进入就绪状态(多线程);
    – run()方法只是Thread的一个普通方法的调用(同一个线程);

    5、说一说 wait和sleep的区别?
    1. 相同点
    – 两者都可以暂停线程的执行
    2. 区别
    – sleep方法 :是Thread的静态方法,当前线程将睡眠n毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进入可运行状态,等待CPU的到来。睡眠不释放锁(如果有的话)
    – wait方法:是Object方法,必须和synchronized关键字使用,线程进入阻塞状态,当notify或者notifyall被调用后,会解除阻塞。但只有重新占用互斥锁之后才会进入可运行状态。睡眠时,会释放互斥锁。
    – sleep没有释放锁,而wait方法释放了锁
    – sleep常用于暂停线程执行,而wait常用于线程间交互/通信
    – sleep()方法执行完成后,线程会自动苏醒,或者可以使用wait(long timeout)超时后线程会自动苏醒。wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyall()方法
    6、说一说 notify 和 notifyAll 的区别以及使用场景?
    锁池:假设线程A已经拥有某个对象的的锁,而其他线程B、C想要调用这个对象的synchronized的方法(块),在该对象进入此方法(块)之前必须先获得该对象的锁,但是此时对象锁正在被A占有,在这时线程B、C就进入到锁池中。
    等待池:假设某个线程调用了某个对象的wait()方法,该线程就会释放该对象的锁,同时线程进入到该对象的等待池中,进入到等待池中的对象不会去竞争该对象的锁。

    notify( ) 会随机唤醒一个处于等待池中的线程,进入锁池去竞争获取锁的机会。

    notifyAll( ) 会唤醒所有处于等待池中的线程,一起进入锁池去竞争获取锁的机会。

    在生产-消费模型中,生产者生产出消息时,可以调用 notify( ) 通知消费者消费。当多个线程需要同时满足某个条件才能运行时,可以使用 notifyAll( ) 唤醒所有等待线程,同时执行任务。

    0 赞同 0 条回复
  • 。 永久会员 2023年7月11日 下午4:46

    1.Java线程的状态有:创建状态:NEW;运行状态:RUNABLE;结束状态:Terminal;等待状态:WAIT,Time-Wait;阻塞状态:BLOCK;线程调用start方法进入运行状态,如果运行结束进入结束状态,在运行过程中,可能会因为等待锁而进入阻塞状态,或者因为wait方法进入等待状态;

    2.通过线程池创建线程,通过重写thread的run方法并调用start方法,实现runable接口调用run方法;

    3.一个是类,一个是接口,thread实现了ruanable接口;

    4.当前线程调用run方法就是一次普通的方法调用,start方法会创建新线程去执行run方法;

    5.wait会释放锁,sleep不会,wait需要notify或者notifyAll唤醒,sleep时间到了主动恢复;

    6.notify会随机唤醒等待队列中的一个线程,notifyAll会唤醒所有线程,在生产者-消费者模型中可以使用notify唤醒一个线程进行消费,当需要多个线程时可以使用notifyAll

    0 赞同 0 条回复
  • Gary 永久会员 2023年7月9日 上午10:19

    1.状态总共有六个:new runnable wait block timed_wait terminated。线程一开始被创建,调用start方法,等获取到CPU的时间片之后,正式开始执行run方法,在执行的过程中,可能会遇到竞争锁导致阻塞,或者主动等待需要别的线程唤醒的情况,最后执行完或者发生了没有捕获的异常,线程终止。

    2.继承Thread类,重写run方法,run方法只能是void类型;实现Runnable接口,重写run方法,run方法只能是void类型;实现Callable接口,重写run方法,run方法可以是任何自定义的类型

    3.一个是继承类,一个是实现接口,一个类只能继承一个父类,但是可以实现多个接口,继承Runnable接口更加灵活

    4.run方法是在main线程中执行这个线程的run方法,start是单独创建一个线程出来,在另一个线程执行run方法

    5.wait会释放锁,需要别的线程来唤醒;sleep不会释放锁,到时间之后会自己醒,继续执行下面的逻辑

    6.notify是随机唤醒等待队列里面的其中一个线程,有可能唤醒的不是想要获取这个锁的线程,也可能导致想要获取这个锁的线程一直都没有被唤醒;notifyAll是唤醒等待队列中的所有线程,让这些线程去竞争想要的锁。
    当只有两个线程在协作的时候,可以用notify来唤醒,比如生产者-消费者模型,当生产者生产了一个产品后,可以用notify唤醒消费者;
    当有两个以上的线程协作的时候,需要唤醒多个线程,可以用notifyAll来唤醒

    0 赞同 0 条回复
  • 秊 永久会员 2023年6月23日 下午2:06

    1、在 Java 中,一个线程的生命周期有哪些?

    大致有六种,我串起来说一下:当一个线程对象被创建时,它会处于创建状态。当调用线程的 start( ) 后,线程进入就绪状态,此时线程还没有真正的执行,需要等待分配 CPU 时间片,只后才会进入真正的运行状态,开始执行 run( ) 中的代码。

    在线程运行时,可能会因为需要等待锁的释放等而进入阻塞状态。或者会调用自身的 wait( ) 和 join( ) 进入等待状态。

    最后线程正常执行完,或者发生了未捕获的异常,会进入终止状态,结束。

    2、在 Java 的中,创建线程的方式有哪些?

    Java 中一共有三种方式创建一个线程:

    第一种也是最常见的一种就是通过实现 Runnable 接口,覆写其中的 run( )。

    第二种是继承 Thread 类,Thread 类本身就实现了 Runnable 接口,所以也只需覆写 run 方法即可。

    第三种是实现 Callable 接口,它与 Runnale 的区别在于 Callable 为线程的执行提供了一个返回值 FutureTask 类,可以使用这个 FutureTask 类的 get 等方法查询这个线程是否执行完毕。

    3、你觉得Thread类和Runable接口的最大区别是什么?

    Runnable 是一个接口,Thread 是一个实现了 Runnable 接口的类。按照 Java 中的单继承、多实现的特性,如果使用继承 Thread 类来创建进程,则无法再继承其他类,会降低代码的灵活性。这时用实现 Runnable 接口比较好。

    4、说一说run() 方法和 start() 的区别?

    Thread 的 run( ) 只是在主线程中的一个普通方法调用,而 start( ) 则会创建一个新的子线程来执行,它底层使用 native 方法实现的,用来开启一个新线程并执行自己定义的 run 方法。

    5、说一说 wait和sleep的区别?

    sleep( ) 是 Thread 类的方法,sleep( ) 是 Object 类的方法。

    sleep( ) 可以在任何地方使用,wait( ) 则只能在同步方法或同步块中使用,并且 sleep( ) 只是让出了 CPU,并没有释放同步资源锁,sleep 结束之后会继续执行。

    而 wait( ) 则是让当前线程退出同步资源锁,进入等待队列,让其他正在等待这个锁的线程争夺资源并运行。在这之后,只有调用了 notify( ) / notifyAll( ) 唤醒这个线程,它才会进入锁池,并加入到争夺资源的过程中。

    6、说一说 notify 和 notifyAll 的区别以及使用场景?

    notify( ) 会随机唤醒一个处于等待池中的线程,进入锁池去竞争获取锁的机会。

    notifyAll( ) 会唤醒所有处于等待池中的线程,一起进入锁池去竞争获取锁的机会。

    在生产-消费模型中,生产者生产出消息时,可以调用 notify( ) 通知消费者消费。当多个线程需要同时满足某个条件才能运行时,可以使用 notifyAll( ) 唤醒所有等待线程,同时执行任务。

    0 赞同 0 条回复

# 回答此问题

后才能回答