java线程池Executor框架

有关java线程池Executor框架说明

上图中可以明显的看出Executor框架的基本结构。

但是一般不会直接操作这上面的类。

创建线程池

使用Executors这个类,去创建不同的线程池。

Executors类不属于Executor框架体系,它是一个工具类

Executor提供了相应的方法创建相关的线程池:

其实内部就是调用了ThreadPoolExecutor类的构造函数,创建ThreadPoolExecutor类,去创建不同的线程池。

所以如果有必要,我们可以根据相关业务创建自己的线程池,即:继承ThreadPoolExecutor类。

下图可以看到Executors类的相关方法:

 

主要有4个方法分别创建不同的线程池:

newSingleThreadExecutor():创建只有一个线程的线程池,如果有多的任务。任务会存储在队列中等待执行。

       线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。(程序还会运行)

newScheduledThreadPool(int n):创建有调度计划的线程池。支持定时及周期性任务执行。

newFixedThreadPool(int n):创建一个固定线程数的线程池,线程的数量不会增加,如果任务数量超过线程数量。则多余的任务处在等待状态。直到有空闲的线程。 

       线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。(程序还会运行)

newCachedThreadPool():创建有缓存的线程池。只要有新的任务就会创建线程,线程的数量没有限制。线程池中的线程执行完之后。如果没有新的任务。就会在60秒后销毁,不占用资源

 

向线程池提交任务

有了线程池,我们就可以使用线程池。执行相关的任务了。

即调用Executor接口实现类的executor(Runnable run)方法。

 执行代码如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorTest {
    public static void main(String[] args) {
//     demo1   ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//做完任务后自动销毁
//     demo2   ExecutorService cachedThreadPool = Executors.newFixedThreadPool(2);
//     demo3   ExecutorService cachedThreadPool = Executors.newSingleThreadExecutor();
//        for (int i = 0; i < 10; i++) {
//            final int index = i;
//            try {
//                Thread.sleep(index * 500);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            cachedThreadPool.execute(new Runnable() {
//                public void run() {
//                    System.out.println(Thread.currentThread().getName());
//                    try {
//                        Thread.sleep(2000);
//                    }catch (InterruptedException e){
//                        e.printStackTrace();
//                    }
//
//                }
//            });
//        }
//demo4 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() { public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS);//延时3秒执行 //demo4.1 ScheduledExecutorService scheduledThreadPool2 = Executors.newScheduledThreadPool(5); scheduledThreadPool2.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds" +Thread.currentThread().getName()); } }, 3, 1, TimeUnit.SECONDS);//延时3秒执行。之后每1秒执行一次任务 } }

  

 

进阶知识:

线程池内部如何实现的。

 http://ifeve.com/java-threadpool/

 

总结:其实就是记住这些类:

Executor接口类。

Executors工具类

ThreadPoolExecutor类

说明:Executor接口类定义了一个执行线程的方法executor(Runnable runnable)。

Executors工具类定义里创建线程池的方法其实返回的就是ThreadPoolExecutor类,而ThreadPoolExecutor是Executor的实现类(间接实现了Executor)。

所以可以执行executor()方法,去调度线程。

 

 

posted @ 2018-05-14 11:21  xie风细雨  阅读(69)  评论(0)    收藏  举报