在java中创建线程一共有4中方法:
1. extend Thread
2. implement Runnable -- 无返回值
3. implement Callable -- 有返回值
4. ExecutorService 线程池方式创建 如下:
ExecutorService pool = Executors.newFixedThreadPool(3); 一共有四种。
1. newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2. newFixedThreadPool() 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
3. newScheduledThreadPool() 创建一个定长线程池,支持定时及周期性任务执行。
4. newSingleThreadExecutor() 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
在需要大量开辟线程的实际项目中我们通常会使用线程池的方式去创建线程并执行。这样可以减少线程的创建,销毁等系列操作开销。
在线程池中有7大参数需要知道:
创建线程池时会有7个参数,其中核心为前面5个,我们常常会去设置的。
- corePoolSize : 线程池的核心线程大小
线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。 - maximumPoolSize : 线程池最大线程数量
线程池是不会去无限制的创建新线程,它的最大线程数由该参数控制。 - keepAliveTime : 空闲线程的存活时间
线程如果处于空闲时,首先当前线程数量大于核心线程(corePoolSize )数,那么指定时间后,空闲线程被销毁。 - unit 计量单位
keepAliveTime的计量单位 - workQueue : 工作队列
新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。在java中提供了4种队列,都是集合框架的成员。
· ArrayBlockingQueue 经典的“有界缓冲区”,由数组支持的FIFO(先进先出)有界阻塞队列。
· SynchronousQueue 一个阻塞队列,其中每个插入操作都必须等待另一个线程执行相应的移除操作,反之亦然。
· LinkedBlockingQueue 基于链接节点的可选(未指定容量是默认为Integer.MAX_VALUE)有界阻塞队列。 该队列对元素 FIFO(先进先出)进行排序。
· PriorityBlockingQueue 一个无界阻塞队列,它使用与类 PriorityQueue 相同的排序规则并提供阻塞检索操作。需要注意资源耗尽(导致OOM)。 - threadFactory 线程工程
按需创建新线程的对象。使用线程工厂消除了对 new Thread 调用的硬连线,使应用程序能够使用特殊的线程子类、优先级等。 - handler 拒绝策略处理器
无法由 ThreadPoolExecutor 执行的任务的处理程序。jdk中提供了4中拒绝策略。
· CallerRunsPolicy
在调用者的线程中执行任务线程,如果执行器已关闭,任务将被丢弃。
· AbortPolicy
直接抛出异常。
· DiscardPolicy
不做任何事情,丢弃任务。
· DiscardOldestPolicy
获取并忽略执行程序将执行的下一个任务,如果一个任务立即可用,然后重试任务 r 的执行,除非执行程序关闭,在这种情况下,任务 r 被丢弃。