java 基础面试题——线程 备战春招,秋招

线程: 线程共享内存加什么关键字?

volatile主要保证内存的可见性

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

进程是程序的一次执行过程,是系统运行的基本单位。线程是一个比进程更小的执行单位,一个进程可以包含 多个线程

2、并行和并发的区别?

并行:单位时间多个处理器同时处理多个任务。 并发:一个处理器处理多个任务,按时间片轮流处理多个任务

3、多线程的优缺点(为什么使用多线程、多线程会引发什 么问题)

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

4、线程的上下文切换

CPU会通过时间片分配算法来循环执行任务,当前任务执行完一个时间片后会切换到下一个任务,但切换 前会保存上一个任务的状态,因为下次切换回这个任务时还要加载这个任务的状态继续执行,从任务保存到在 加载的过程就是一次上下文切换。

5、线程的生命周期和状态

初始状态,注意此时还未调用 start() 方法 运行状态,包含就绪和运行中两种状态 阻塞状态 等待状态 超时等待状态,和等待状态不同的是,它可以在制定的时间自行返回 终止状态,线程运行结束

6、线程通信的方法有哪些?

锁与同步 wait() / notify() 或 notifyAll() 信号量 管道

7、什么是多线程,什么是线程池

多线程是指在同一个时间段内可以执行多个任务,从而提高CPU的使用率。 由于在java中创建一个线程所消耗的资源较大,为了减少创建线程的资源开销,所以我们引进了线程池,线程 池的作用是维护了一组线程,这些线程不会随着任务的执行完毕而销毁,从而减少了创建线程所需要的资源开 销。 线程池的优点如下:   减少了资源创建 => 减少了内存的开销,创建线程暂用内存   降低了系统的开销 => 创建线程需要时间,请求会被延迟处理   提高系统的稳定性 => 避免无线创建线程引起的内存溢出 OutOfMeoryError

8、java中提供的线程池有几种?

根据返回的对象类型创建的线程池有三种,分别是:   创建返回 ThreadPoolExecutor 对象   创建返回 ScheduleThreadPoolExecutor 对象 定时任务线程池   创建返回 ForkJoinPool 对象

9、创建线程的几种方式

创建线程有三种方式:   1.继承Thread类并重写run方法   2.实现Runnable()接口,传入Thread或者线程池   3.实现Callable()接口,传入Thread或者线程池,Callable()在执行完毕会返回结果     大多数场景下,我们会选择第二种方式,也就是实现Runnable()接口,传入Thread或者线程池,它相对于继 承Thread类来说,有三个优点:   1.适合多个执行相同的程序代码的线程去调用处理同一个资源   2.可以避免Java中的单继承的限制   3.线程池只能放在Runnable接口或者Callable接口中,不能直接放在继承Thread的类中

10、在JAVA中守护线程和本地线程的区别

在java中线程分为两种,即守护线程(Daemon)和用户线程,任何线程都可以设置成为守护线程或者用 户线程,通过方法Thread.setDeamon(boolean)方法来确定,当传递的参数为true时,就代表将该线程 设置为守护线程,否则则为用户线程,Thread.setDeamon(boolean)方法必须在Thread.strat()之 前调用,否则运行时会抛出异常。 两者的区别: 唯一的区别是判断虚拟机(JVM)何时离开,Deamon是为其他线程提供服务的,如果全部的用户线程都 已经撤离,Deamon没有可以服务的线程,此时JVM撤离。也可以理解为守护线程是 JVM 自动创建的线程(但 不一定),用户线程是程序创建的线程;比如 JVM 的垃圾回收线程是一个守护线程,当所有线程已经撤离, 不再产生垃圾,守护线程自然就没事可干了,当垃圾回收线程是 Java 虚拟机上仅剩的线程时,Java 虚拟机 会自动离开。

11、线程池的七大参数

1.corePoolSize:核心线程数,线程池正常情况下保持的线程数 好比古代大户人家的长工,比较稳定,没有特殊情况下,这些长工都会一直待在府上,不会被辞退 2.maximumPoolSize:最大线程数,当线程池繁忙时最多可以拥有的线程数 好比古代大户人家过寿或者其他节日时长工不够用需要招短工,这个参数指定了长工加上短工最多可以存 在的数量 3.keepAliveTime:空闲线程存活时间 好比没有活了之后就不需要短工了,这个参数就相当于没有活之后这些短工还可以呆在府上的时间,如果过 了这个时间府上还是用不到他们,那就会辞退 4.TimeUnit:时间单位,配合着keepAliveTime使用,用于描述keepAliveTime的时间单位 比如你传一个数,timeUnit来指定这个时间时小时还是天又或者时分钟秒 5.BlockingQueue:线程池的任务队列,用于保存线程池执行任务的容器 6.ThreadFactory:线程工厂,用于创建线程池中线程的工厂方法,可以通过它设置线程的命名规则、优先级 和线程类型等 7.RejectedExecutionHandler:拒绝策略,当任务量超过线程池可以保存的最大任务数时,执行该策略

12、多线程的场景,结合项目去说

多线程处理后台任务: 一般来说,我们需要在后台处理的任务,通常会使用定时器来开启后台线程处理,比如有些数据表的状态 我需要定时去修改、我们搜索引擎里面的数据需要定时去采集、定时生成统计信息、定时清理上传的垃圾文件 等。 多线程异步处理任务: 当我们需要处理一个耗时操作并且不要立刻知道处理结果时,我们可以开启后台线程异步处理该耗时操 作,这样可以提高用户体验。比如我之前做的一个项目需要上传简历附件,后台需要对简历附件进行解析,保 存到数据表中,因为涉及多种格式的处理,所以我们开启多线程异步处理此操作,这样用户就不用等到我们的 简历解析完就能看到服务端的响应了。再比如用户下载简历时,我们需要将数据表中的数据生成简历附件并且 通过邮件发送到用户邮箱,该操作也可以开启多线程异步处理。 多线程分布式计算: 当我们处理一个比较大的耗时任务时,我们可以将该任务切割成多个小的任务,然后开启多个线程同时处 理这些小的任务,切割的数量一般根据我们服务器CPU的核数,合理利用多核CPU的优势。比如下载操作可以使 用多线程下载提高下载速度;清理文件时,开启多个线程,按目录并行处理等等。

13、线程池的拒绝策略

AbortPolicy抛出异常,中止任务。抛出拒绝执行 RejectedExecutionException 异常信息。线程池默 认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行 CallerRunsPolicy 使用调用线程执行任务。当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程 直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提 交速度过快,可能导致程序阻塞,性能效率上必然的损失较大 DiscardPolicy 直接丢弃,其他啥都没有 DiscardOldestPolicy 丢弃队列最老任务,添加新任务。当触发拒绝策略,只要线程池没有关闭的话,丢 弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值