java基础

JAVA基础—并发工具包与连接池

2018-08-07  本文已影响2人  东方舵手

ThreadPool — 线程池

线程池的种类

  1. CachedThreadPool — 可缓存线程池
  2. FixedThreadPool — 定长线程池
  3. SingleThreadExecutor — 单线程池
  4. ScheduledThreadPool — 调度线程池

1. CachedThreadPool 例子

/**
 * 可缓存线程池
 */
public class CachedThreadPoolSample {
    public static void main(String[] args) {
        //调度器对象 ExecutorService用于管理线程池
        //创建一个可缓存线程池, 可缓存线程池的特点是,无限大,如果线程池中没有可用的线程则创建,有则使用空闲的线程
        ExecutorService threadPool = Executors.newCachedThreadPool();

        for (int i = 1;i<=1000;i++){
            final int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " : " + index);
                }
            });
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //关闭线程池
        threadPool.shutdown();

    }
}

运行结果

...
pool-1-thread-217 : 718
pool-1-thread-90 : 717
pool-1-thread-218 : 713
pool-1-thread-28 : 714
pool-1-thread-3 : 712
pool-1-thread-219 : 703
pool-1-thread-32 : 710
pool-1-thread-88 : 709

2. FixedThreadPool — 定长线程池

/**
 * 定长线程池
 */
public class FixedThreadPoolSample {
    public static void main(String[] args) {
        //调度器对象 ExecutorService用于管理线程池
        //创建一个定长线程池,固定线程总数,空闲线程用于执行任务,如果线程都在使用后续任务则处于等待状态
        ExecutorService threadPool = Executors.newFixedThreadPool(3);
        //如果任务处于等待的状态,备选的等待算法默认为FIFO(先进先出)。 LIFO(后进先出)

        for (int i = 1;i<=1000;i++){
            final int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " : " + index);
                }
            });
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //关闭线程池
        threadPool.shutdown();

    }
}

运行结果

...
pool-1-thread-1 : 997
pool-1-thread-1 : 998
pool-1-thread-1 : 999
pool-1-thread-1 : 1000
pool-1-thread-2 : 740
pool-1-thread-3 : 972

3. SingleThreadExecutor — 单线程池

/**
 * 单线程线程池
 */
public class SingleThreadPoolSample {
    public static void main(String[] args) {
        //调度器对象 ExecutorService用于管理线程池
        //创建一个单线程线程池
        ExecutorService threadPool = Executors.newSingleThreadExecutor();

        for (int i = 1;i<=1000;i++){
            final int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " : " + index);
                }
            });
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //关闭线程池
        threadPool.shutdown();

    }
}

运行结果

pool-1-thread-1 : 994
pool-1-thread-1 : 995
pool-1-thread-1 : 996
pool-1-thread-1 : 997
pool-1-thread-1 : 998
pool-1-thread-1 : 999
pool-1-thread-1 : 1000

4. ScheduledThreadPool — 调度线程池

/**
 * 调度线程池
 */
public class ScheduledThreadPoolSample {
    public static void main(String[] args) {
        //创建可调度线程池 初始化5个线程
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

        //延迟三秒 只执行一次run()方法
        scheduledThreadPool.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("延迟3秒执行");
            }
        }, 3, TimeUnit.SECONDS);

        //延迟1秒执行,每三秒执行一次
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date() + "延迟1秒执行,每三秒执行一次");
            }
        }, 1, 3, TimeUnit.SECONDS);

        /**
         * 项目实际开发中ScheduledExecutorService 与 Timer都不会用到
         * 因为有成熟的调度框架quartz , 或者spring自带调度
         * 程序的调度框架支持一种表达式 Cron表达式
         */
    }
}

运行结果

Tue Aug 07 13:00:01 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:04 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:07 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:10 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:13 CST 2018延迟1秒执行,没三秒执行一次
上一篇下一篇

猜你喜欢

热点阅读