java中线程池创建的几种方式
Posted 莫等、闲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中线程池创建的几种方式相关的知识,希望对你有一定的参考价值。
java中创建线程池的方式一般有两种:
- 通过Executors工厂方法创建
- 通过new
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)自定义创建
Executors工厂方法创建
package com.javaBase.LineDistancePond; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 〈一句话功能简述〉; * 〈功能详细描述〉 * * @author jxx * @see [相关类/方法](可选) * @since [产品/模块版本] (可选) */ public class TestThreadPoolExecutor { public static void main(String[] args) { //创建使用单个线程的线程池 ExecutorService es1 = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { es1.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在执行任务"); } }); } //创建使用固定线程数的线程池 ExecutorService es2 = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { es2.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在执行任务"); } }); } //创建一个会根据需要创建新线程的线程池 ExecutorService es3 = Executors.newCachedThreadPool(); for (int i = 0; i < 20; i++) { es3.submit(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在执行任务"); } }); } //创建拥有固定线程数量的定时线程任务的线程池 ScheduledExecutorService es4 = Executors.newScheduledThreadPool(2); System.out.println("时间:" + System.currentTimeMillis()); for (int i = 0; i < 5; i++) { es4.schedule(new Runnable() { @Override public void run() { System.out.println("时间:"+System.currentTimeMillis()+"--"+Thread.currentThread().getName() + "正在执行任务"); } },3, TimeUnit.SECONDS); } //创建只有一个线程的定时线程任务的线程池 ScheduledExecutorService es5 = Executors.newSingleThreadScheduledExecutor(); System.out.println("时间:" + System.currentTimeMillis()); for (int i = 0; i < 5; i++) { es5.schedule(new Runnable() { @Override public void run() { System.out.println("时间:"+System.currentTimeMillis()+"--"+Thread.currentThread().getName() + "正在执行任务"); } },3, TimeUnit.SECONDS); } } }
new ThreadPoolExecutor()自定义创建
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) ;
corePoolSize:核心线程数量
maximumPoolSize:最大线程数量;
workQueue:等待队列,当任务提交时,如果线程池中的线程数量大于等于corePoolSize的时候,把该任务封装成一个Worker对象放入等待队列;
keepAliveTime:线程池维护线程所允许的空闲时间。当线程池中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了keepAliveTime;
TimeUnit :时间级别
threadFactory:它是ThreadFactory类型的变量,用来创建新线程。
handler:它是RejectedExecutionHandler类型的变量,表示线程池的饱和策略。如果阻塞队列满了并且没有空闲的线程,这时如果继续提交任务,就需要采取一种策略处理该任务。
ThreadFactory:定义线程池中创建的线程,如线程名称,优先级等,可以几次ThreadFactory重新newThread(Runnable r)方法。
以上是关于java中线程池创建的几种方式的主要内容,如果未能解决你的问题,请参考以下文章