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()方法,去调度线程。

浙公网安备 33010602011771号