线程池的作用

  1. 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  2. 提高效率,当需要执行任务时候,不需要创建的新的线程,只需要到现场池调用即可,任务的执行效率大大提升。
  3. 提高对线程的管理,一味的创建的新的线程不仅浪费资源,而且不利于管理,线程池可以对线程进行统一的管理等。

线程池的使用:

  1 Java中的四种线程池

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

 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() {
                @Override
                public void run() {
                    System.out.println(index);
                }
            });

    线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

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

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        for (int i = 0; i <10 ; i++) {
             int index = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(index);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });

    因为线程池大小为5,每个任务输出index后sleep 1秒,所以每1秒打印5个数字.

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

 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println(index);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });

    结果依次输出,相当于顺序执行各个任务

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

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

  延迟执行:

 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
        scheduledThreadPool.schedule(new Runnable() {

            @Override
            public void run() {
                System.out.println("5秒后出现");
            }
        }, 5, TimeUnit.SECONDS);
    }

  定期执行:

  ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.out.println("延迟1秒后每3秒执行一次");
            }
        }, 1, 3, TimeUnit.SECONDS);
    }

  延迟1秒后每3秒执行一次

  

 

posted on 2017-11-25 21:24  py_Im  阅读(130)  评论(0)    收藏  举报