Java面试问答——多线程
什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对进行运算提速。
创建线程池有几种方式?
- 继承Thread类
- 实现Runnable接口,重写run()方法
- 实现Callable接口,覆写call()方法,有返回值
- 使用线程池创建
Java自带的线程池有哪些?
- newCachedThreadPool,可缓存线程池
- newFixedThreadPool,创建一个指定工作线程数量的线程池
- newSingleThreadExecutor,单工作线程最大的特点是可保证顺序地执行各个任务
- newScheduleThreadPool,创建一个定长的线程池,支持定时及周期性任务执行。
说说线程池的拒绝策略
- AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
- CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
- DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
- DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。
除了JDK默认为什么提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。
比如Spring integration中就有一个自定义的拒绝策略CallerBlocksPolicy,将任务插入到队列中,直到队列中有空闲并插入成功的时候,否则将根据最大等待时间一直阻塞,直到超时。