线程相关问题(一)附答案
-
什么是BIO和NIO?
- BIO是Blocking I/O,同步阻塞I/O模式;数据的读写在一个线程里进行操作,在连接数小的情况下,这种模式是比较不错的,可以让每一个连接专注自己的I/O且编程模式简单,不需要考虑其他的限流、过载等问题,适用于低并发的应用。
- NIO是NO-Blacking或New I/O,非同步阻塞的I/O模型;并且是面向缓存的,基于通道的I/O的方法,适用于高并发的应用。
-
线程的基本状态是什么?
线程的基本状态分为六大种
- NEW:新建线程,未使用start方法
- BLOCKED:线程未获得CPU的时间片,阻塞状态
- WAITING:线程等待状态,待唤醒
- TIME_WAITING:线程等待状态,一定时间之后自动结束等待
- TERMINAL:线程死亡,线程以及执行完毕
- RUNNABLE:线程执行状态
-
创建线程的方式有有什么区别?
线程创建有四种:Thread、Runnable、Callable、Exector
- 继承Thread类,和实现其他两个接口;java是单继承,接口可以多和实现,使用接口有利于代码的灵活性
- Runable和Callable是run方法没有返回值,call方法有返回值
- 继承Thread类,如果需要调用当前线程直接使用this关键字就行;实现接口的话需要使用Thread.CurrentThread方法
- 线程的创建和归还需要花费大量的内存资源,如果使用线程池的话,不使用的情况下直接放入线程池里面即可,无需资源的消耗,立取即用。
-
线程池有什么优点?
- 减少线程创建和归还的内存资源的消耗
- 方便线程的管理:线程是稀缺资源,不能无限的创建而导致性能的下降
- 提高响应速度,取线程比创建线程的速度当然快
-
常用的线程池有什么?
- 固定大小的线程池:NewfixedThreadPool
- 单线程的线程池:NewsingleThreadExectorPool
- 具有缓冲的线程池:NewCacheThreadPool
- 定时以及周期执行的线程池:NewScheduledThreadPool
-
线程池的常用工作队列有什么?
- 可设置容量的队列:LinkedBlockingQueue
- 有界队列:ArrayBlockingQueue
- 基于优先级的队列:PriorityBlockingQueue
- 同步的队列:SynchronousQueue
- 延迟队列:DelayedWorkQueue
-
线程池的拒绝策略是什么?
- 丢弃并抛异(拒绝执行异常)常默认策略:AbortPolicy
- 丢弃但不抛异常:DiscardPolicy
- 丢给线程处理,谁调用谁执行:CallerRunpolicy
- 丢弃最旧的任务,接收此任务:DisCardOldPolicy
-
什么是线程安全?如何保证线程安全?
线程安全是指在一些高并发的线程执行下,对数据进行的一系类安全操作,某一进程访问数据,其他不能访问,防止数据的不一致和数据污染
保证线程安全:使用线程安全的类和使用synchronize锁等
-
ConcurrentHashMap是如何实现线程安全的?
- JDK7时候底层使用的是Segment锁进行数据的分段加锁,当一个线程访问数据时,另一个线程也可以访问其他资源;
- JDK8使用的是synchronize锁和CAS进行加锁,锁的是当前链表或者红黑树的根节点,若不产生Hash冲突效率还能提高N倍。
-
什么是上下文切换?
一般对于线程的说法,线程在抢夺CPU时间片时候进行切换,是操作系统中时间消耗最大的操作。
一般情况下线程个数多于CPU的核心个数,而CPU在一个时间段内只能对一个线程进行操作,为了让线程都得到的有效执行,CPU采取的操作是时间片轮换(操作系统方面的),当一个线程对CPU的时间片执行完成,然后别的线程从就绪状态切换到执行状态,CPU的时间片给别的线程。