什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,可以使用多线程对进行运算提速。

创建线程池有几种方式?

  • 继承Thread类
  • 实现Runnable接口,重写run()方法
  • 实现Callable接口,覆写call()方法,有返回值
  • 使用线程池创建

Java自带的线程池有哪些?

  • newCachedThreadPool,可缓存线程池
  • newFixedThreadPool,创建一个指定工作线程数量的线程池
  • newSingleThreadExecutor,单工作线程最大的特点是可保证顺序地执行各个任务
  • newScheduleThreadPool,创建一个定长的线程池,支持定时及周期性任务执行。

说说线程池的拒绝策略

  • AbortPolicy策略:该策略会直接抛出异常,阻止系统正常工作。
  • CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前的被丢弃的任务。
  • DiscardOleddestPolicy策略: 该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务。
  • DiscardPolicy策略:该策略默默的丢弃无法处理的任务,不予任何处理。

除了JDK默认为什么提供的四种拒绝策略,我们可以根据自己的业务需求去自定义拒绝策略,自定义的方式很简单,直接实现RejectedExecutionHandler接口即可。

比如Spring integration中就有一个自定义的拒绝策略CallerBlocksPolicy,将任务插入到队列中,直到队列中有空闲并插入成功的时候,否则将根据最大等待时间一直阻塞,直到超时。