美文网首页面试题
【面试大纲】Java多线程

【面试大纲】Java多线程

作者: bearPotMan | 来源:发表于2019-12-08 21:23 被阅读0次

    创建线程的方式

    只有一种,就是 new Thread()!
    即便是使用线程池,它也是这样的。

    实现线程的方式

    • 继承 Thread 类;
    • 实现 Runnable接口,重写run方法【run方法无返回值】;
    • 实现 Callable 接口,重写call方法【call方法有返回值】。

    线程的生命周期

    那顺便借一张图,简单复习一下操作系统层面线程的生命周期:


    出自艿艿的博客-芋道源码

    线程池几个参数的含义

    • int corePoolSize:核心线程数,即便它们处于空闲状态也要保留在池中的线程数;
    • int maximumPoolSize:池中允许的最大线程数
    • long keepAliveTime:当线程数大于核心线程数时,这是多余的空闲线程将在终止之前等待新任务的最长时间;
    • TimeUnit unit:keepAliveTime参数的时间单位;
    • BlockingQueue<Runnable> workQueue:在执行任务之前用于保留任务的队列。 此队列将仅保存由 execute 方法提交的 Runnable 任务;
    • ThreadFactory threadFactory:执行程序创建新线程时要使用的工厂;
    • RejectedExecutionHandler handler:因达到线程边界和队列容量而被阻止执行时使用的处理程序;

    四种拒绝策略

    • AbortPolicy:抛出RejectedExecutionException异常;
    • DiscardPolicy:不执行任何操作;
    • DiscardOldestPolicy:丢弃最旧的未处理请求;
    • CallerRunsPolicy:在调用者线程中执行任务。

    线程池运行过程

    • 当线程池中运行的线程数小于 coolPoolSize 时,每当来新的任务的时候,启动一个线程去执行当前的任务;
    • 当线程池中运行的线程数大于等于 coolPoolSize 时,新来的任务将进入阻塞队列等待被执行;
    • 当阻塞队列中任务满了的时候,将使用 maximumPoolSize 设置的值,即启动额外的线程来执行新来的任务;
    • 当线程池中运行的线程数大于等于 maximumPoolSize 时,启动拒绝策略来拒绝后续的任务。

    上面只是一个大致的执行流程,详细的流程比上面要复杂的多,具体可以查阅 execute(Runnable command) 方法和 addWorker(Runnable firstTask, boolean core) 方法的源码!

    好了,多线程的大纲差不多就这些吧!继续加油!!!

    相关文章

      网友评论

        本文标题:【面试大纲】Java多线程

        本文链接:https://www.haomeiwen.com/subject/uomygctx.html