java多线程面试

一、 线程

线程是进程的一个实体,是cpu调度、分配,可以独立运行的基本单位。

1. 线程的状态:

    new 新建、runnable 就绪、running 运行、blocked 阻塞、dead 死亡。

2. 创建线程的方式

        继承 thread 重写 run 、 实现 runnable 重写 run、 实现 callable 重写 call、线程池executor。

3. runnable 和 callable 的区别:

        run 无返回值,且无法捕获异常,call有返回值,可以获取异常信息。

4. start 和 run 的区别

        start 开启一个线程并调用run开始执行,run只是调用一个方法。

5. wait 和 sleep 区别

        wait 来自 object类,释放锁,必须在同步代码块中用,不需要捕获异常

        sleep 来自 thead类,不会释放锁,可以在任意地方使用,需要捕获异常。

二、线程池

        避免重复创建已有线程执行任务,提高响应速度

1. 分类:

newCachedThreadPool : 创建一个可进行缓存重复利用的线程池。

newFixedThreadPool : 创建一个可重用固定线程数的线程池。

newSingleThreadExecutor : 创建一个使用单个worker 线程的线程池。

newSingleThreadScheduledExecutor : 创建一个单线程执行程序。

newScheduledThreadPool :创建一个线程池,延迟运行命令或者定期的执行。

newWorkStealingPool : 创建一个带并行级别的线程池。

2. 核心参数

corePoolSize:核心线程池的大小。
maximumPoolSize:线程池能创建线程的最大个数。
keepAliveTime:空闲线程存活时间。
unit:时间单位,为keepAliveTime 指定时间单位。
workQueue:阻塞队列,用于保存任务的阻塞队列。
threadFactory:创建线程的工程类。
handler:饱和策略(拒绝策略)。

3.  工作过程:

        判断核心线程池是否满了,没有满则创建一个新的工作线程来执行任务,如果满了,则进入工作队列,判断工作队列是否满,如果没有满,则将线程放入工作队列,如果满了,则判断是否都在执行任务,如果不是则创建一个新的工作线程来执行,如果满了,则交给饱和策略。

4. 拒绝策略:

        ThreadPoolExecutor.AbortPolicy : 丢弃任务,抛出异常。

        ThreadPoolExecutor.DiscardPolicy:丢弃任务,不抛出异常。

        ThreadPoolExecutor.DiscardOldestPolicy:丢弃最前面任务,重新执行。

        ThreadPoolExecutor.CallerRunsPolicy:既不抛弃任务也不抛出异常,而是将某些任务
回退到调用者

5. 线程池关闭:

        shutdownNow : 将线程池设为stop,尝试停止所有正在执行、未执行线程,返回等待执行任务的列表。

        shutdown:将线程池设为shutdown,中断所有没有执行的线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值