纯面试 纯文字 看起来乱但适合面试总结
多线程
什么是线程和进程?他们是什么关系?
进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。
线程:是一个比进程更小的执行单位,能够完成进程中的一个功能,也被称为轻量级进程。一个进程在其执行的过程中可以产生多个线程。
- 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行
- 进程要想执行任务,必须得有线程,进程至少要有一条线程
多线程有什么用?
- 发挥多核CPU的优势
- 防止阻塞
- 便于建模
创建线程有几种方式?
- 继承Thread类
- 实现Runnable接口
- 使用Callable和Future创建线程
- 使用Executor框架创建线程池
(推荐使用实现Runnable,因为继承只能继承一个,而实现了接口还能可以继承)
并发编程三要素
1)原子性
原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行。
2)可见性
可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。
3)有序性
有序性,即程序的执行顺序按照代码的先后顺序来执行。
多线程同步有哪几种方法?
Synchronized关键字,Lock锁实现,分布式锁等。
Thread 类中的start() 和 run() 方法有什么区别?
这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部 调用了run()方法,这和直接调用run()方法 的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程。start()方法会将新创建的线程交给CPU去调度,CPU可以通过 轮转时间片去执行这个线程,至于是否分给该线程时间片那就看CPU了。
Java中线程的各种状态
针对操作系统来说,线程有五种状态
- 新建状态:即单纯地创建一个线程。
- 就绪状态:在创建了线程之后,调用Thread类的start()方法来启动一个线程,即表示线程进入就绪状态!
- 运行状态:当线程获得CPU时间片,线程才从就绪状态进入到运行状态!
- 阻塞状态:线程进入运行状态后,可能由于多种原因让线程进入阻塞状态,如:调用sleep()方法让线程睡眠,调用wait()方法让线程等待,调用join()方法、suspend()方法(它现已被弃用!)以及阻塞式IO方法。
- 死亡状态:run()方法的正常退出就让线程进入到死亡状态,还有当一个异常未被捕获而终止了run()方法的执行也将进入到死亡状态!
sleep()和wait()的区别,调用这两个函数后,线程状态分别作何改变
① 这两个方法来自不同的类分别是,sleep来自