JAVA四种线程池的使用案例

线程池的创建其实有很多办法,但是jdk为了方便,创建了4中常用的线程池对象:

1.newCachedThreadPool();

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

2.newFixedThreadPool

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

3.newScheduledThreadPool

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

4.newSingleThreadExecutor

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

下面我们分别对应四种方式,写一个demo。

一、先写一个多线程对象:

import java.util.Date;

public class ThreadTest  extends  Thread{

    public void run(){
        //输出当前线程名字,和当前时间
        System.out.println(Thread.currentThread().getName()+";"+new Date());
    }

}


二、可缓存线程池:newCachedThreadPool

public class Test {
    public static void main(String[] args) {
        //创建一个newCachedThreadPool。可缓存线程池。
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        //创建多线程对象
        Thread t1=new ThreadTest();
        Thread t2=new ThreadTest();
        Thread t3=new ThreadTest();
        Thread t4=new ThreadTest();
        Thread t5=new ThreadTest();
        //执行线程池中线程
        cachedThreadPool.execute(t1);
        cachedThreadPool.execute(t2);
        cachedThreadPool.execute(t3);
        cachedThreadPool.execute(t4);
        cachedThreadPool.execute(t5);
        //关闭线程池
        cachedThreadPool.shutdown();
       }
 }

启动main方法,控制台输出:
在这里插入图片描述
注意线程名字和线程抢占的时间,说明线程是同时进行的。
哪怕我们创建10个线程:
在这里插入图片描述

三、定长线程池:newFixedThreadPool;

public class Test {
    public static void main(String[] args) {
		 //创建一个定长线程池,长度是2
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
        //创建多线程对象
        Thread t1=new ThreadTest();
        Thread t2=new ThreadTest();
        Thread t3=new ThreadTest();
        Thread t4=new ThreadTest();
        Thread t5=new ThreadTest();
        //执行线程池中线程
        cachedThreadPool.execute(t1);
        cachedThreadPool.execute(t2);
        cachedThreadPool.execute(t3);
        cachedThreadPool.execute(t4);
        cachedThreadPool.execute(t5);
        //关闭线程池
        cachedThreadPool.shutdown();
       }
 }

启动main方法,控制台输出:
在这里插入图片描述
不管创建多少个,线程数永远只有2个。而且也是同时经行的。

四、单线程池,newSingleThreadExecutor

  ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        Thread t1=new ThreadTest();
        Thread t2=new ThreadTest();
        Thread t3=new ThreadTest();
        Thread t4=new ThreadTest();
        Thread t5=new ThreadTest();
        //执行线程池中线程
        singleThreadExecutor.execute(t1);
        singleThreadExecutor.execute(t2);
        singleThreadExecutor.execute(t3);
        singleThreadExecutor.execute(t4);
        singleThreadExecutor.execute(t5);
        //关闭线程池
        singleThreadExecutor.shutdown();

启动main方法,控制台输出
在这里插入图片描述
一个线程在同一时间执行。

五、定长线程池支持定时器 newScheduledThreadPool

     //创建一个定长线程池支持定时器 newScheduledThreadPool;长度是2
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+";"+new Date());
            }
        }, 1, 3, TimeUnit.SECONDS);
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+";"+new Date());
            }
        }, 1, 3, TimeUnit.SECONDS);
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName()+";"+new Date());
            }
        }, 1, 3, TimeUnit.SECONDS);

启动main方法,控制台输出:
在这里插入图片描述
启动三个定时的任务,但是只有2个线程。
当我们把线程数量定长到5个后:

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

启动main方法,控制台输出:
在这里插入图片描述
发现有三个线程,共同抢占资源了。

最后补充一点:

线程池的作用是,减少创建和销毁线程的时间。从而提高服务器的行性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值