开启多线程的三种方式 1.继承Thread类,重写它的run方法 2.实现Runnable接口 ,重写它的run方法(开发常用) 3.实现callable接口,重写它的call方法,该方法返回值类型 T,而run方法没有返回值 常见的4种线程池 1.可缓存的线程池(CachedThreadPool),先看看池中有没有以前建立的线程,如果有就用,没有就创建新的线程放进线程池,通常用与生命周期很短的异步型任务 2.可重用固定个数的线程池(FixldThreadPool),以共享的无界队列方式来运行这些线程 3.定长线程池(ScheduledThreadPool),支持定时和周期性执行任务 4.单线程化的线程池(SingleThreadPool),保证所有任务都按照指定顺序执行 自定义线程池 自定义线程池需要用到ThreadPoolExecutor类,改类的构造方法有 7 个参数 1.coreSize 核心线程数 (不会被回收),默认情况下当任务到来的时候才会创建线程,但是也有两个方法可以提前创建 2.maxSize 最大线程数 3.long KeepAliveTime : 膨胀出来的线程回收时间(达到核心线程数未达到最大线程数之间的线程) 4.TimeUnit 时间单位 5.BlokingQueue 阻塞队列 (必须有界),自定义的阻塞队列必须有界 6.ThreadFactory 产生线程的工厂 7.rejectedExecutionHandler 拒绝策略 线程池的运行 1.当有任务到来的时候,如果核心线程数没满的话就会创建核心线程执行任务 2.当核心线程数达到最大值,再有任务来的时候会加入阻塞队列,等待执行 3.当阻塞队列也满了的时候,但是最大线程数还没满,就会创建非核心线程执行该任务 4.当最大线程数满了的时候,就会去执行拒绝策略 拒绝策略(4种) 1.直接丢弃任务(DiscardPolicy) 2.丢弃等待时间最长的任务(也就是任务队列的头)DiscardOldestPolicy 3.丢弃任务并抛出异常(默认策略AbortPolicy) 4.将任务交由主线程即提交任务的线程执行(CallerRunsPolicy) 阻塞队列(3种) 1.直接提交 CacheThreadPool 的阻塞队列SynchronousQueue 该队列不存储任务,当有任务来时,调用get方法加入队列,如果没有线程调用take方法获取任务,那么执行put操作的线程将陷入等待 2.无界队列.singleThreadPool和FixedThreadPool使用的是LinkedBlokingQueue队列,当任务超过核心线程数的时候,就会进入队列等待。 ScheduledThreadPool 使用的是DelayedWorkQueue基于优先级的无界队列,会将距离可执行时间最短的任务放到队列的头部,优先级高 3.有界队列.如ArrayBlockingQueue,并配合有限的maxPoolSize来控制资源的消耗