1. 并行和并发有什么区别?同步、异步、阻塞、非阻塞有什么区别?同步等同于阻塞吗?
- 并行:宏观上和微观上都是多个线程一起执行,需要的是多个处理器
- 并发:微观是多个线程快速轮换从而宏观上看是多个线程一起执行,但是同一时间只有一个线程执行,只需要一个处理器就可以实现。
同步和异步是线程之间的概念,对应的是调用者和被调用者,侧重的是消息通知
- 同步:调用者调用方法之后,只有等待被调用者返回结果才能继续执行。
- 异步:调用者调用方法之后,不需要等待被调用者返回结果才能继续执行。方法完成之后会有相应的通知提示调用者结果返回。
阻塞和非阻塞是线程本身的概念,侧重是本身的状态
- 线程未得到结果返回,会被挂起,结果返回之后才会继续执行。
- 线程未得到结果返回,不会被挂机,依旧继续执行。
综上所述,同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。
- 同步非阻塞:当前线程A需要等待调用方法的的线程B返回结果,才会继续执行任务C,但是未阻塞的线程A可以继续执行任务D。
- 异步阻塞:虽然不必等待结果返回,但是当前线程依旧被挂起、
2. 线程和进程的区别?守护线程是什么?线程有哪些状态?
-
进程:包含一个程序运行所需要的资源。在内存中开辟一块空间,需要CPU和相应的资源,有堆、栈、数据段和代码段组成。JVM 就是一个进程。
-
线程:一个进程至少包括一个线程,是CPU调度的最小单位,每一条线程代表进程的一条执行路径。
-
区别:
资源上,进程考虑CPU和内存,线程只要考虑CPU的调度;进程上下文切换所需资源较大,而线程因为共享进程的上下文,所以消耗较少的资源。 -
守护线程:线程分为用户线程和守护线程,守护线程是在后台提供通用服务的线程,二者没有本质区别,唯一的区别就是在于虚拟机的结束。当所有用户线程全部结束,那么虚拟机就会结束,即便还有守护线程在运行。new thread创建的线程都是用户线程,可以调用setDaemon方法把用户线程变成守护线程。垃圾回收线程就是一个守护线程。
-
线程状态
- 创建:创建一个线程
- 就绪:有执行资格,并未执行
- 运行:正在运行的线程
- 阻塞:sleep或者wait方法,线程被挂起
- 结束
3. 创建线程有哪几种方式?线程的 run () 和 start () 有什么区别?
-
创建线程的方式:
- 继承thread类,重写run方法
- 实现runnable接口,重写run方法,作为thread类的参数
- 实现callable接口,仅限线程池
-
run方法和start方法区别:
- start方法是启动线程的方法,调用线程的start方法之后,线程就会进入就绪状态,
- run方法是线程实现逻辑的方法,调用线程的run方式并不会启动线程,只是相当于普通的方法调用
4. ThreadLocal 是什么?有哪些使用场景?
ThreadLocal是线程局部变量,属于线程私有,线程之间不能互相访问。使用ThreadLocal维护变量的时候,为每一个使用该变量的线程提供一个变量的拷贝副本。
synchronized对线程共享的数据加锁,让线程以有序的方式访问该数据。ThreadLocal是为每一个线程在内存中开辟一份私有空间,保证数据安全。synchronized是以时间换空间,ThreadLocal是以空间换时间
ThreadLocal类是管理Thread类中的threadLocals变量,该变量是threadLocalmap类型,即是一个map,key值是threadlocal类对象,value是保存的变量,使用的时候在调用方法的线程传入threadlocal对象中,再把这对象作为key值,保存在map中。
使用场景:数据库连接和session管理。
5. notify () 和 notifyAll () 有什么区别?sleep和wait方法有什么区别
-
sleep方法和wait方法的区别
- sleep是Thread中的方法,wait是Object中的方法
- sleep必须指定时间,wait可以不指定时间,不指定代表当前线程阻塞到持有锁的线程完成任务
- sleep可以写在任何地方,wait只能写在同步代码块中
- sleep释放CPU的使用权,但是不释放锁;wait释放CPU的使用权,同时也释放锁。
-
notify和notifyall方法
- notify方法唤醒,正在等待调用对象的锁的阻塞线程,如果有多个这样的线程,就会随机唤醒。
- notifyall,唤醒所有,正在等待调用对象的锁的阻塞线程。
6. 现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?
- 可以使用thread类的join方法,
- 使用thread的优先级不行,因为优先级不能保证严格按照这样的顺序。
【Java 面试那点事】
这里致力于分享 Java 面试路上的各种知识,无论是技术还是经验,你需要的这里都有!
这里可以让你【快速了解 Java 相关知识】,并且【短时间在面试方面有跨越式提升】
面试路上,你不孤单!