java线程池工作流程是什么?java线程池如何创建?

java线程池的作用我想大家都知道了,在java中我们经常需要用到多线程来处理一些业务,提高工程响应速度,那java线程池工作流程是什么?下面来我们就来给大家讲解一下java线程池工作流程。

java线程池工作流程.jpg

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

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

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

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

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

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

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

java线程池如何创建?

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

1.newCachedThreadPool 这里的线程池是无限大的,当一个线程完成任务之后,这个线程可以接下来完成将要分配的任务,而不是创建一个新的线程。

public static void main(String[] args)
{
    ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    for (int i = 0; i < 10; i++)
    {
        final int index = i;
        try
        {
            Thread.sleep(10);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        cachedThreadPool.execute(new Runnable()
        {
            public void run()
            {
                System.out.println(index);
            }
        });
    }
}

2.newFixedThreadPool

public static void main(String[] args)
{
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    for (int i = 0; i < 10; i++)
    {
        final int index = i;
        fixedThreadPool.execute(new Runnable()
        {
            public void run()
            {
                try
                {
                    System.out.println(index);
                    Thread.sleep(10);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
}

3.newScheduledThreadPool

public static void main(String[] args)
{
    ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
    for (int i = 0; i < 10; i++)
    {
        scheduledThreadPool.schedule(new Runnable()
        {
            public void run()
            {
                System.out.println("delay 3 seconds");
            }
        }, 3, TimeUnit.SECONDS);
    }
}

4.newSingleThreadExecutor 按顺序来执行线程任务 但是不同于单线程,这个线程池只是只能存在一个线程,这个线程死后另外一个线程会补上。

public static void main(String[] args)
{
    ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 10; i++)
    {
        final int index = i;
        singleThreadExecutor.execute(new Runnable()
        {
            public void run()
            {
                /*                  System.out.println(index);*/
                try
                {
                    System.out.println(index);
                    Thread.sleep(2000);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
}

我们按照以上的几种方法就能够完成java线程池的创建,它能够使得线程可以重复使用,并且提高响应速度。最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

java培训课程哪里好?做java要哪些能力?

java代码规范七大原则是什么?java代码编程要注意哪些?

json字符串太长怎么换行?Java字符串如何连接?