Java: 线程池(ExecutorService、Executors)+定时器( ScheduledExecutorService、Timer)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 线程池
  • 定时器

一、线程池

作用:节约线程,不用每次需要使用线程就去创建,在代码中使用线程池显得更高级优雅

创建方式:用 ExecutorService或者用Executors,建议用ExecutorService,原因:程序员更清楚规则,核心线程和最大线程数量,数列等都可以自己自由设置。 用Executors创建的方法不适合大型项目中,初学建议用ExecutorService 创建线程这样更熟悉规则,小型代码也可以使用 Executors创建线程,因为方便。

   ExecutorService创建线程池:

ExecutorService pool = new ThreadPoolExecutor(3, 5 ,
                6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),
               new ThreadPoolExecutor.AbortPolicy() );

 Executors创建线程池(底层也是用的ExecutorService):

  // 1、创建固定线程数据的线程池
        ExecutorService pool = Executors.newFixedThreadPool(3);

提示:以下是本篇文章正文内容,下面案例可供参考

定时器

作用:定时执行某个任务,在项目经常用

两种创建方式:

用  ,代码简单,由于是单线程,一个线程出现异常或者时间过长,会影响其他的线程。

Timer timer = new Timer();  // 定时器本身就是一个单线程。
        // 2、调用方法,处理定时任务
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行AAA~~~" + new Date());
            }
        }, 0, 2000);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行BB~~~"+ new Date());
            }
        }, 0, 2000);

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行CCC~~~"+ new Date());
            }
        }, 0, 3000);

用线程池创建,代码比较麻烦,但是由于是多线程,一个线程因为异常跑崩不会影响其他的线程。

​​​​​

// 1、创建ScheduledExecutorService线程池,做定时器
        ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);

        // 2、开启定时任务
        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出:AAA  ==》 " + new Date());
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2, TimeUnit.SECONDS);


        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出:BBB  ==》 " + new Date());
                System.out.println(10 / 0);
            }
        }, 0, 2, TimeUnit.SECONDS);


        pool.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + "执行输出:CCC  ==》 " + new Date());
            }
        }, 0, 2, TimeUnit.SECONDS);

    }

猜你喜欢

转载自blog.csdn.net/qq_54508596/article/details/126131401