Java面试-多线程-基础


  • 创建线程的三种方式:继承 Thread; Runnable 接口;Callable 和 Future
  • 线程的五种基本状态:新建;就绪;运行;阻塞;死亡
  • 阻塞队列:ArrayBlockingQueue(有界阻塞队列);LinkedBlockingQuene(无界阻塞队列);SynchronousQuene(零容量阻塞队列,生产者线程的插入操作必须等待消费者线程的移除操作);PriorityBlockingQueue(优先级的无界阻塞队列);DelayedWorkQueue(延时无界阻塞队列)
  • 线程池:ThreadPoolExecutor -> ExecutorService
  • Executors
    • newCachedThreadPool 适用于执行大量短暂异步任务的应用程序:SynchronousQuene & 核心线程数为 0
    • newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数:LinkedBlockingQueue & 核心线程数=最大线程数
    • newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行:DelayedWorkQueue
    • newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务:LinkedBlockingQueue & 核心线程数1 最大线程数1
  • Executors 的问题
    • FixedThreadPool 和 SingleThreadPool 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM
    • CachedThreadPool 和 ScheduledThreadPool 允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM
  • wait 和 sleep 方法的区别
    • sleep 是 Thread 的方法,wait是 Object 的方法
    • sleep方法没有释放锁,而 wait 方法释放了锁
    • wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可以在任何地方使用
    • sleep 必须捕获异常,而 wait,notify 和 notifyAll 不需要捕获异常

文章作者: 钱不寒
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 钱不寒 !
  目录