面试题-多线程精华版

多线程有什么用?

现在我们的电脑的CPU都是多核心的,如果我们还是采用单线程的方式去编程,那么我们电脑上的CPU核心只有一个会被利用上,其余都都会被闲置。为了提高cpu核心的利用率,我们可以采用多线程编程。让每个核心在同一时刻都只能有一个线程在上面运行。好比,你雇佣了4个工人,如果你只交代了一个任务,那么这四个工人中,只会有一个工人在工作,其他三个就被闲置了,是资源的浪费。如果我们同时布置四个任务,或者更多的任务,那么这四个工人就都会被利用上。也就提高了我们的任务效率了。

线程和进程有什么区别?

  1. 一个线程只能属于一个进程;而一个进程可以拥有多个线程(至少只有一个);线程依赖于进程而存在。
  2. 进程是系统资源分配的最小单位,而线程是CPU调度的最小单位。
  3. 进行拥有独立的内存单元,而多个线程共享进行的内存资源。
  4. 进程编程调试简单可靠,但是创建、切换、销毁开销大;而线程编程则恰恰相反。
  5. 进程之间不会相互影响,一个进程的宕机,并不会影响到其他进程;但是一个进程中的一个线程的挂掉,可能就是导致其他线程也会挂掉。

Java实现多线程有哪几种方式?

  1. 继承Thread类实现多线程。
  2. 实现Runnable接口实现多线程。
  3. 使用ExecutorServicde、Callable、Future实现有返回值的多线程。

启动线程方法start()和run()有什么区别?

只有调用了start()方法,才是真正开启多线程,此时多个线程的run()体内的代码会同时执行。但是如果只是执行run(),那么定义的多个run()体内的代码还只是在同一个线程中按顺序挨个执行。

一个线程的生命周期有哪几种状态?它们之间如何流转的?

  1. NEW:就是刚刚创建的线程,还没有被调用。
  2. RUNNABLE:即已经进入可以运行的状态,或者已经正在运行的线程。
  3. BLOCKED:还没获取到锁,被阻塞的线程。例如碰到synchronized关键字。
  4. WAITING:表示线程处于无限等待的状态,调用了Object.wait()、Thread.sleep()、Thread.join()方法,等待唤醒
  5. TIMED_WAITING:表示线程处于有限时间等待的状态的,调用了Object.wait(long millions)、Thread.sleep(long millions)、Thread.join(long millions)方法
  6. TERMINATED:表示线程已经执行完毕了。需要注意的是,线程一旦进行RUNNABLE,就无法回到NEW状态了。一旦进入了TERMINATED状态,就无法回到任何其他状态了。

    推荐文章:https://learn.lianglianglee.c...

Java多线程sleep和wait的区别?

  • 使用方面:sleep属于Thread类的方法,而wait属于Object类的方法;sleep()可以在任意地方使用,而wait只能在同步方法或代码块中使用。
  • CUP及锁资源释放:
    sleep()、wait()都会暂定当前线程,让出CPU的执行时间。但是sleep()并不会释放锁,而wait()方法会释放锁资源。
  • 异常捕获方面:sleep需要捕获或抛出异常,而wait()方法则不需要。

Java实现多线程的几种方法

  1. 同步方法:用synchronized关键字修饰的方法。
  2. 同步代码块:用synchronized关键字修饰的代码块。
  3. 同步变量:使用volatile修饰的变量
  4. 重入锁。

你可能感兴趣的:(多线程java面试)