JUC多线程常见面试题汇总

1.并行和并发有什么区别?

并行是指多个处理器同时执行多个任务,每个核心实际上可以在同一时间独立地执行不同的任务。

并发是指系统有处理多个任务的能力,但是任意时刻只有一个任务在执行。在单核处理器上,多个任务是通过时间片轮转的方式实现的。但这种切换非常快,给人感觉是在同时执行。

2.线程和进程的区别?

进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务,不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间

线程更轻量,线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程)

3.java中创建线程有哪些方式?

在java中一共有四种常见的创建方式,分别是:继承Thread类、实现Runnable接口、实现Callable接口、线程池创建线程。通常情况下,我们项目中都会采用线程池的方式创建线程。

4.Runnable和Callable两个接口创建线程有什么不同?

最主要的是两个线程一个是有返回值,一个是没有返回值的。

Runnable 接口run方法无返回值;Callable接口call方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。

还有一个就是,他们异常处理也不一样。Runnable接口run方法只能抛出运行时异常,也无法捕获处理;Callable接口call方法允许抛出异常,可以获取异常信息

在实际开发中,如果需要拿到执行的结果,需要使用Callalbe接口创建线程,调用FutureTask.get()得到可以得到返回值,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

5.线程包括哪些状态,状态之间是如何变化的?

在JDK中的Thread类中的枚举State里面定义了6种线程的状态分别是:新建、可运行、终结、阻塞、等待和有时限等待六种。

新建:当一个线程对象被创建,但还未调用start方法时处于新建状态,调用了start方法,就会由新建进入可运行状态。如果线程内代码已经执行完毕,由可运行进入终结状态。当然这些是一个线程正常执行情况。

阻塞:如果线程获取锁失败后,由可运行进入Monitor的阻塞队列阻塞,只有当持锁线程释放锁时,会按照一定规则唤醒阻塞队列中的阻塞线程,唤醒后的线程进入可运行状态。

等待:如果线程获取锁成功后,但由于条件不满足,调用了wait()方法,此时从可运行状态释放锁等待状态,当其它持锁线程调用notify()或notifyAll()方法,会恢复为可运行状态。

有时限等待:还有一种情况是调用sleep(long)方法也会从可运行状态进入有时限等待状态,不需要主动唤醒,超时时间到自然恢复为可运行状态。

6.线程中的wait和sleep方法有什么不同?

它们两个的相同点是都可以让当前线程暂时放弃CPU的使用权,进入阻塞状态。

不同点主要有三个方面:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值