java线程池工作原理是什么?java如何实现一个线程池?

Java线程池是java重点知识,在java中我们经常需要用到多线程来处理一些业务,提高工程响应速度,所以对于java线程池的工作原理要十分清楚,那java线程池工作原理是什么?下面来我们就来给大家讲解一下。

java线程池工作原理.png

线程池刚被创建的时候,只是向系统里申请一个用于执行流程队列和管理线程池的线程资源。在调用execute()添加一个任务时,线程池会按照以下流程执行:

1、如果正在运行的线程数少于corePoolSize(用户定义的核心线程数),线程池就会立刻创建线程并执行该线程任务;

2、如果正在运行的线程数大于corePoolSize,该任务就会被放入阻塞队列中;

3、如果阻塞队列已满且正在运行的线程数少于maximumPoolSize时,线程池会创建非核心线程立刻执行该线程任务;

4、在阻塞队列已满并且正在运行的线程数大于maximunPoolSize时,线程池将会拒绝执行该任务并且抛出拒绝异常RejectExecutionException;

5、在线程执行完毕后,该任务会从线程队列中移除,然后从队列中取下一个任务继续执行;

6、在线程处于空闲的时间超过keepAliveTime,并且正在运行的线程数大于corePoolSize, 该线程将会被认为是空闲线程并停止;所以线程任务都执行完毕后,线程池会收缩到corePoolSize大小。

java如何实现一个线程池?

1、创建任务

class worker implements Runnable
{
    @Override
    public void run()
    {
        System.out.println(Thread.currentThread()
            .getName());
    }
}

2、创建线程池,并将任务传递进去

public class Test
{
    private static final int corePoolSize = 4;
    private static final int maximumPoolSize = 6;
    private static final long keepAliveTime = 2;
    private static final TimeUnit unit = TimeUnit.SECONDS;
    private static final int QueueSize = 5; //将参数设定为固定值
    public static void main(String[] args)
    {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            corePoolSize
            , maximumPoolSize
            , keepAliveTime
            , unit
            , new ArrayBlockingQueue < > (QueueSize)
            , new ThreadPoolExecutor.CallerRunsPolicy()
        ); //构造线程池
        for (int i = 0; i < 10; i++)
        {
            worker w = new worker();
            executor.execute(w);
        } //传入10个任务
        executor.shutdown(); //关闭线程池
        while (!executor.isTerminated())
        {}
        System.out.println("finish");
    }
}

3、运行结果

pool - 1 - thread - 4
pool - 1 - thread - 2
pool - 1 - thread - 3
pool - 1 - thread - 1
pool - 1 - thread - 5
pool - 1 - thread - 1
pool - 1 - thread - 4
pool - 1 - thread - 5
pool - 1 - thread - 3
pool - 1 - thread - 2
finish

这样我们就能够实现一个简单的线程池了,合理的使用java线程池能够降低资源消耗,因此掌握java线程池很有必要!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

java中级开发面试知识点有哪些?java中级有哪些常见面试题?

Java线程池满了会等待吗?Java线程池等待有几种方式?

grails框架用的多吗?Grails应用程序元素如何创建?