19.线程池的使用
Executor框架
1.为了更好的控制多线程,jdk并发包的核心,其中一部分比较重要的类:Excutor,帮助开发人员有效控制多线程、作为线程工厂的角色。
Executors创建线程static方法
1.newFixedThreadPool(),该方法返回一个固定的线程池,线程池的的固定数量是始终不变的,若当有一个任务提交的时候,线程池空闲线程则立即去
执行;若任务为空,则会被暂缓到一个任务队列里面,则会一直等待有空闲的线程去执行。
底层实现:
![](https://images2017.cnblogs.com/blog/897287/201708/897287-20170810020035199-403496680.png)
2.newSingleThreadExecutor(),创建一个单个的线程池。若空闲则去执行,否则暂缓任务队列。
底层实现:
![](https://images2017.cnblogs.com/blog/897287/201708/897287-20170810020036464-693779628.png)
3.newCachedThreadPool(),返回一个可根据实际的线程个数去自动调整的线程池,不限制最大线程数量,若有空闲线程则执行任务,若无任务则不创建
新的线程,并且每个线程空闲的都被在60秒内被回收。
底层实现:
![](https://images2017.cnblogs.com/blog/897287/201708/897287-20170810020037464-1531465355.png)
4.newScheduledThreadPool(),可根据一个策略去,定时执行线程池里面的任务。
package demo8.threadPool;
import java.util.concurrent.*;
public class DemoScheduledThreadPool extends Thread {
@Override
public void run() {
System.out.println("run ...");
}
public static void main(String[] args) {
/*executorService.scheduleWithFixedDelay(执行的对象体,启动的耗时,多少时间执行一次, TimeUnit时间单位);*/
DemoScheduledThreadPool demoScheduledThreadPool = new DemoScheduledThreadPool();
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> scheduledFuture = executorService.scheduleWithFixedDelay(demoScheduledThreadPool,5,3, TimeUnit.SECONDS);
}
}
底层实现:
![](https://images2017.cnblogs.com/blog/897287/201708/897287-20170810020038433-313806059.png)
底层实现来源于 return new ThreadPoolExecutor
package demo8.threadPool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
* Created by liudan on 2017/7/22.
*/
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService1 = Executors.newFixedThreadPool(10);
ExecutorService executorService2 = Executors.newSingleThreadExecutor();
ExecutorService executorService3 = Executors.newCachedThreadPool();
ExecutorService executorService4 = Executors.newScheduledThreadPool(1);
//底层实现来源于 return new ThreadPoolExecutor
}
}
submit与execute的区别:
1.submit可以传入参数为实现Callable接口的实例,则返回Future实例对象。 2.execute的返回值是void。