java创建线程池的几种方式是什么?该怎么实现?

TheDisguiser 2020-06-24 14:48:51 java常见问答 3790

在任何java项目开发时都离不开数据库,在连接数据库时有时我们会用到线程池,小伙伴们知道java有几种创建线程池的方法么,它们该怎么实现呢?下面听小编为你介绍介绍吧。

为什么需要线程池?

因为线程池帮助线程生命周期开销问题和资源不足等问题提供各种了解决方案。它通过对多个任务重用线程,而让线程创建的开销被分摊到了多个任务上。这样的优点是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。并且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。

线程池创建方式及实现

线程池通常所说的创建方式为以下四种:

newCachedThreadPool

表示创建一个可缓存线程池,如若线程池长度超过处理的所需,就能够灵活的回收空闲线程,如果没有可回收线程,就新建线程。

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

newFixedThreadPool

表示一个指定工作线程数量的线程池

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest
{
    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(2000);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

newSingleThreadExecutor

表示一个单线程化的Executor

package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolExecutorTest
{
    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()
                {
                    try
                    {
                        System.out.println(index);
                        Thread.sleep(2000);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

newScheduleThreadPool

表示一个定长的线程池

package test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorTest
{
    public static void main(String[] args)
    {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        scheduledThreadPool.schedule(new Runnable()
        {
            public void run()
            {
                System.out.println("delay 3 seconds");
            }
        }, 3, TimeUnit.SECONDS);
    }
}

以上就是本篇文章的所有内容了,小伙伴们知道该怎么创建线程池了吗?如果还有了解更多相关java入门知识的想法吗,请一定要记得关注我们网站。

推荐阅读:

线程池submit和execute区别有哪些?

线程池大小一般设计成cpu多少倍为好?CPU性能详解

线程池原理都有哪些?线程池是什么?