多线程基础面试题

多线程基础面试题

1. 什么是进程?什么是线程?

参考答案

    线程是处理器任务调度和执行的基本单位,进程是操作系统资源分配的基本单位。
    进程是程序的一次执行过程,是系统运行的基本单位。线程是一个比进程更小的执行单位,一个进程可以包含多个线程。

2. 进程和线程区别?

参考答案

 
  
地址空间 资源 并发性 切换
进程 进程之间是独立的地址空间 进程之间的资源是独立的,能很好的进行资源管理和保护 可并发执行 进程切换时,消耗的资源大,效率低。
线程 线程共享本进程的地址空间 线程共享本进程的资源如内存、I/O、cpu 等,不利于资源的管理和保护 可并发执行 线程切换时,消耗的资源小,效率高。

3. 什么是并发?什么是并行?

参考答案

    并发:指应用能够交替执行不同的任务。
    并行:指应用能够同时执行不同的任务。
    两者区别:并发是交替执行,并行是同时执行。

4. Java 中实现线程方式?

参考答案

    1. 继承 Thread 类
    2. 实现 Runnable 接口
    3. 实现 Callable 接口

5. 守护线程和普通线程区别?

参考答案

    守护线程与普通线程的唯一区别是:当 JVM 中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则不会退出。

6. 多线程优缺点?

参考答案

    优点:当一个线程进入等待状态或者阻塞时,CPU 可以先去执行其他线程,提高 CPU 的利用。
    缺点:
    1. 上下文切换:频繁的上下文切换会影响多线程的执行速度。
    2. 不恰当的编程有可能会出现死锁
    3. 资源限制:在进行并发编程时,程序的执行速度受限于计算机的硬件或软件资源。在并发编程中,程序执行变快的原因是将程序中串行执行的部分变成并发执行,如果因为资源限制,并发执行的部分仍在串行执行,程序执行将会变得更慢,因为程序并发需要上下文切换和资源调度。

7. 如何停止一个正在运行的线程?

参考答案

    1. stop():已废弃。stop 方法存在线程安全问题,会破坏线程的原子性。
    2. interrupt(): Interrupt 不会真的中止线程,只是给线程加上了一个标识,即 isInterrupted 从 false 变成了 true;要是线程处于 waiting 状态,再调用 Interrupt 会清除线程的阻塞状态,使线程状态变为 runnable,而且 isInterrupted 也会从 true 变回 false。
    3. 使用标志位

8. runnable 和 callable 区别?

参考答案

    相同点:
        两者都是接口
        两者都需要调用 start() 启动线程
    不同点:
        callable 的核心是 ca11() 方法,允许返回值,runnable 的核心是 run() 方法,没有返回值
        ca11() 方法可以抛出异常,但是 run() 方法不行

9. run 和 start 区别?

参考答案

    线程是通过 Thread 对象所对应的方法 run() 来完成其操作的,而线程的启动是通过 start() 方法执行的。
    run() 方法可以重复调用,start() 方法只能调用一次。

10. sleep 和 wait 区别?

参考答案

    1. sleep 是线程中的方法,但是 wait 是 Object 中的方法。
    2. sleep 方法不会释放 lock,但是 wait 会释放,而且会加入到等待队列中。
    3. sleep 方法不依赖于同步器 synchronized,但是 wait 需要依赖 synchronized 关键字。
    4. sleep 不需要被唤醒(休眠之后退出阻塞),但是 wait 需要(不指定时间需要被别人中断)。

11. synchronized 关键字的使用方式?

参考答案

    synchronized 有三种方式来加锁,分别是:
    1. 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
    2. 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
    3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

12. 线程的 sleep() 方法和 yield() 方法有什么不同?

参考答案

    1.  s1eep() 方法会使得当前线程暂停指定的时间,没有消耗 CPU 时间片。
    2.  sleep()使得线程进入到阻塞状态,yield() 只是对 CPU 进行提示,如果 CPU 没有忽略这个提
示,会使得线程上下文的切换,进入到就绪状态。
    3. sleep() 一定会完成给定的休眠时间,yield() 不一定能完成。
    4. sleep() 需要抛出 InterruptedException,而 yield() 方法无需抛出异常。

你可能感兴趣的:(Java面试真题精讲,面试,职场和发展,java,开发语言)