多线程常见面试题(含常见项目遇到多线程问题解决及面试对话)

纯面试 纯文字 看起来乱但适合面试总结

多线程

什么是线程和进程?他们是什么关系?

进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。

线程:是一个比进程更小的执行单位,能够完成进程中的一个功能,也被称为轻量级进程。一个进程在其执行的过程中可以产生多个线程。

  • 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行
  • 进程要想执行任务,必须得有线程,进程至少要有一条线程

多线程有什么用?

  1. 发挥多核CPU的优势
  2. 防止阻塞
  3. 便于建模

创建线程有几种方式?

  1. 继承Thread类
  2. 实现Runnable接口
  3. 使用Callable和Future创建线程
  4. 使用Executor框架创建线程池

(推荐使用实现Runnable,因为继承只能继承一个,而实现了接口还能可以继承)

并发编程三要素

1)原子性

原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。

2)可见性

可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。

3)有序性

有序性,即程序的执行顺序按照代码的先后顺序来执行。

多线程同步有哪几种方法?

Synchronized关键字,Lock锁实现,分布式锁等。

Thread 类中的start() 和 run() 方法有什么区别?

这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部 调用了run()方法,这和直接调用run()方法 的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程。start()方法会将新创建的线程交给CPU去调度,CPU可以通过 轮转时间片去执行这个线程,至于是否分给该线程时间片那就看CPU了。

Java中线程的各种状态

针对操作系统来说,线程有五种状态

  1. 新建状态:即单纯地创建一个线程。
  2. 就绪状态:在创建了线程之后,调用Thread类的start()方法来启动一个线程,即表示线程进入就绪状态!
  3. 运行状态:当线程获得CPU时间片,线程才从就绪状态进入到运行状态!
  4. 阻塞状态:线程进入运行状态后,可能由于多种原因让线程进入阻塞状态,如:调用sleep()方法让线程睡眠,调用wait()方法让线程等待,调用join()方法、suspend()方法(它现已被弃用!)以及阻塞式IO方法。
  5. 死亡状态:run()方法的正常退出就让线程进入到死亡状态,还有当一个异常未被捕获而终止了run()方法的执行也将进入到死亡状态!

sleep()和wait()的区别,调用这两个函数后,线程状态分别作何改变

① 这两个方法来自不同的类分别是,sleep来自

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值