什么是线程
调度程序执行的最小工作单元
线程生命周期
新建 new 开启 start() 运行 run() 阻塞 等待wait() 、休眠sleep() 、join()、、、 结束 stop()、run()正常结束、出现异常Exception或Error
如何实现多线程
继承thread
实现runnable
实现Callable
ThreadPoolExecutor 参数
int corePoolSize 核心线程数 int maximumPoolSize 最大线程数 long keepAliveTime存活时长 TimeUnit unit 时间单位 BlockingQueue workQueue 工作队列 ThreadFactory threadFactory 线程工厂 RejectedExecutionHandler handler拒绝策略
默认实现方式有三种阿里不建议这么使用
/*** threadPoolExecutorTest 线程池 阿里不建议这么使用线程池 (因为会浪费太多资源,)*/public void threadPoolExecutorTest() {//有多少任务就会创建多少线程,(当有很多任务执行的时候,没有可用的线程才会去创建新线程,如果有可用线程 那么将会出现线程复用)// 执行速度很块 核心线程 0, 最大线程 max无数, 队列为同步队列 1 (核心0,最大无数,队列1,第1个先来的任务会直接执行)ThreadPoolExecutor newCachedThreadPool (ThreadPoolExecutor) Executors.newCachedThreadPool();//分批执行 执行速度中等 核心线程 10, 最大线程 10 ,队列为无边界队列max无数 (核心10,最大10,队列为无边界队列. 先进入的10个任务会先执行,后面的线程在队列中等待,等前面10个执行完了之后 再执行10个)ThreadPoolExecutor newFixedThreadPool (ThreadPoolExecutor) Executors.newFixedThreadPool(10);//单个执行 执行速度很慢 核心线程 1, 最大线程 1,队列为无边界队列max无数 (核心1,最大1,队列为无边界队列. 第1个任务先来会直接执行,其他后面的就会进入等待状态,等这个执行完了之后再执行1个,依次下去)ThreadPoolExecutor newSingleThreadExecutor (ThreadPoolExecutor) Executors.newSingleThreadExecutor();}
/*** newCachedThreadPool 源码* 创建一个线程池该线程池根据需要创建新线程但是将在先前构造的线程可用时重用它们。* 这些池通常将提高执行许多短期异步任务的程序的性能。* 如果可用对{code execute}的调用将重用以前构造的线程。* 如果没有可用的现有线程则将创建一个新线程并将其添加到池中。* 六十秒内未使用的线程将终止并从缓存中删除。* 因此保持空闲时间足够长的池不会消耗任何资源。* 请注意可以使用{link ThreadPoolExecutor}构造函数创建具有相似属性但不同详细信息例如超时参数的池。* 返回新创建的线程池** return*/public static ExecutorService newCachedThreadPool() {/*** 核心线程 corePoolSize 0* 最大线程 maximumPoolSize 0x7fffffff (一个常数它保存{code int}可以最大值)* 存活实长 keepAliveTime 60* 时间单位 unit second 秒* 工作队列 workQueue SynchronousQueue 同步队列 只有一个线程**/return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue());}
/*** 创建一个线程池该线程池 重用 在共享的无边界队列上运行的固定数量的线程。* 在任何时候最多{code nThreads}个线程将是活动的处理任务。* 如果在所有线程都处于活动状态时提交了其他任务则它们将在队列中等待直到某个线程可用为止。* 如果在关闭之前执行过程中由于执行失败导致任何线程终止则在执行后续任务时将使用新线程代替。* 池中的线程将一直存在直到明确地* { ExecutorServiceshutdown shutdown}为止。** param nThreads 池中的线程数* return 新创建的线程池* throws IllegalArgumentException if {code nThreads < 0}*/public static ExecutorService newFixedThreadPool(int nThreads) {/*** 核心线程 corePoolSize nThreads* 最大线程 maximumPoolSize nThreads* 存活实长 keepAliveTime 0* 时间单位 unit MilliSeconds 千分之一秒* 工作队列 workQueue LinkedBlockingQueue 无界队列,默认指定了容量为 最大值 this(Integer.MAX_VALUE);*/return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue());}
/*** 创建一个执行程序该执行程序使用在不受限制的队列上操作的 单个 工作线程。* 但是请注意如果该单线程由于在关闭之前的执行过程中失败而终止则在需要执行新任务时将使用一个新线程代替。* 保证任务按顺序执行并且活动的任务不超过一个在任何给定时间。* 与其他等效的{code newFixedThreadPool1}不同可以保证返回的执行程序不可重新配置为使用其他线程。** return the newly created single-threaded Executor* 返回新创建的单线程执行器*/public static ExecutorService newSingleThreadExecutor() {/*** 核心线程 corePoolSize 1* 最大线程 maximumPoolSize 1* 存活实长 keepAliveTime 0* 时间单位 unit MilliSeconds 千分之一秒* 工作队列 workQueue LinkedBlockingQueue 无界队列,默认指定了容量为 最大值 this(Integer.MAX_VALUE);*/return new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue()));}
阿里支持自定义线程池
/*** 核心线程10 ,这10个线程会一直存活着,不受keepAliveTime的影响,每有任务他就会运行会直接跳过创建的过程* 最大核心线程数20, 20-1010个非核心线程数,这10个核心会受keepAliveTime的影响而消失* 存活时长60s* 阻塞队列 初始容量30 线程初始化时创建30个线程* 超过核心线程数之后逐步创建非核心线程在存活时间超过60s之后将会被销毁* 超过最大线程数的线程会按照拒绝策略执行默认拒绝策略表示直接中止并报错*/ThreadPoolExecutor threadPoolExecutor new ThreadPoolExecutor(10, 20, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(30));