java面试题------多线程
1.并行和并发有什么区别
- 并行:是在多个cpu上并行运行程序
- 并发:是在单个cpu上多线程进行交替运行在cpu上
2.线程和进程的区别
- 进程:进程是一个程序的一次运行(例如:音乐播放器、QQ)。是资源分配的基本单元
- 线程:线程是进程的一段逻辑或则一次活动。是cpu调度的基本单元,一个进程最少有一个线程。
3.守护线程是什么
- 线程分为用户线程和守护线程。守护线程就在主程序运行时在后台运行提供某种服务的线程,例如:jvm虚拟机的垃圾回收机制。守护线程必须在主线程之前设置,否则会出现错误。守护线程启动的线程也是守护线程。当被守护线程结束,守护线程也随之结束。
4.创建线程的几种方式
- 第一种:直接继承Thread类,重写父类的run方法。这种方法一般不常用,因为java是单继承,一但继承Thread类就不能继承其他类。
- 第二种:实现Runnable接口,重写run方法,这种方法较为常用。
- 第三种:实现Callable接口,重写call方法。
5.简述runnable和callable有什么区别
- 返回值:Runnable无返回值,Callable可以定义返回值
- 启动方式:Runnable可以通过Thread类或者是线程池来启动,但是Callable只能通过线程池启动
- 异常机制:Runnable不允许抛出异常,Callable允许抛出异常,那么这就意味着Callable如果报错可以利用全局方式处理
6.线程有那些状态
- 就绪:当线程执行了start方法,该线程就进入了就绪状态
- 执行:当cpu调度该线程时,进入执行状态
- 阻塞:当线程需要外界输入,或者调用了wait方法,线程被阻塞。
- 睡眠:当线程调用了sleep方法,线程睡眠指定时长,然后在进入就绪状态
- 结束:线程执行完成
7.sleep和wait有什么区别
- sleep方法需要设置睡眠的时长,wait一般不需要设置,在加锁状态下,sleep不释放资源和锁,而wait需要释放资源和锁。sleep到指定时长自动唤醒,而wait不能主动唤醒,需要notifyAll来配合进行唤醒。
8.notify和notifyAll有什么区别
- 当线程调用wait方法进入等待状态,当调用notify则只唤醒一个线程,notifyAll可以唤醒所有的线程。
9.创建线程池有哪几种方式
- newFixedThreadPool:该线程池的特点是:没有临时线程全部都是核心线程,工作队列是一个阻塞时链式队列,默认容量是Integer.MAX_VALUE,可以认为能够存储无限多的任务,使用场景:比较长的任务,例如百度网盘下载资源。
- newWorkStealingPool:创建一个线程池,保持足够的线程支持,给定的并行性水平,可以使用多个队列减少争用。对应的并行性水平最大线程数积极参与,或可用参与、任务处理。实际的线程数量动态增长和收缩。一个没有工作窃取池保证提交任务的顺序执行。
- newCachedThreadPool:该线程池没有核心线程都是临时线程,临时线程数量是Integer.MAX_VALUE,也是无穷大的,工作队列是一个同步队列,使用场景:高并发,短任务场景
- newScheduledThreadPool:定时线程,在线程启动之后,每隔n秒执行一次。
10.线程池都有哪些状态
- Running:能够接收新任务,以及对已添加的任务进行处理
- Shutdown:不能接受新任务,但可以对已添加任务进行处理
- Stop:不能接受新任务,也停止已添加的任务,正在执行的任务也会终止
- Tidying:当线程池任务为0个时,则是Tidying状态
- Terminated:线程池彻底终止