Java面试那点事——基础200116

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 相关知识】,并且【短时间在面试方面有跨越式提升

面试路上,你不孤单!
在这里插入图片描述

发布了154 篇原创文章 · 获赞 839 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/qq_33945246/article/details/104016112