提纲:

基础八股知识🔥

  • 并发三要素

    • 原子性

    • 可见性

    • 有序性

  • 线程

    • 定义

    • 创建线程的方式

    • 相关方法

  • 解决并发问题

    • 同步

      • 悲观锁

      • 乐观锁

    • 异步

面试八股真题🎈

  • 1、说说Java中实现多线程有几种方法

  • 2、采用实现Runnable、Callable接口的方式创建线程的优缺点

  • 3、采用继承Thread类的方式创建线程的优缺点

  • 4、如何停止一个正在运行的线程

  • 5、notify()和notifyAll()有什么区别

  • 6、sleep()和wait() 有什么区别

  • 7、volatile 是什么?可以保证有序性吗?

  • 8、Thread 类中的start() 和 run() 方法有什么区别?

  • 9、为什么wait, notify 和 notifyAll这些方法不在thread类里面

一、基础八股知识点

1. 并发三要素

  • 原子性

  • 可见性

    • 实现方法:

      • 1.volatile

      • 2.final

      • 3.syn修饰

  • 有序性

    • 体现在线程优先级上

2.线程

  • 定义:线程是 cpu 调度的最小单位,同一个 Java 进程中的线程共享进程中的内存资源

  • 创建线程的方式:

    • 让类继承 Thread,实现 run 方法,通过调用 start 方法启动线程并执行 run 方法

    • 实现 Runable 接口,作为任务对象传给 Thread 或线程池,调用 Thread 或线程池的run 和 excute 方法执行 Runable 接口的 run 方法

    • 实现 Callable 接口,方法与 Runable 接口一样,可以使用 FutureTask 线程执行并得到返回结果

    • 使用 ThreadPoolExcute 自定得到线程池,也可以使用 Excutors 获取 JDK 中一些提前定义好的线程池,调用 excute 方法传入 Runable 任务对象来执行

  • 不同方式创建线程的区别:

    • 实现Runnable和Callable接口。是用这种方法创建的线程还可以继承其他类;

    • 继承Thread类。用法简单但是不能再继承别的类;

    • Callable重写call方法,Runnable重写run方法,call方法可以抛异常,run方法不可以,Callable执行后有返回值,Runnable没有

  • 相关方法:

    • static 静态方法

      • currentThread:获取当前正在执行的线程

      • interrupted:获取并重置目标线程的打断标记

      • yield:线程主动交出时间片,进入 Runable 状态

      • sleep:线程主动交出时间片,进入 Time_Wait 状态

    • 非静态方法

      • isInterrupted:获取线程的打断标记,不会重置

      • interrupt:打断线程,若被打断的线程正在 sleep/join/wait 会抛出异常
      • join:等待另一个线程执行完毕

3.解决并发问题

  • 同步

    • 悲观锁

      • Sychronized 锁