线程池:
预先创建线程的一种技术。
目的:
线程池在还没任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行复用。减少频繁的创建和销毁对象。
JDK1.5版本以上提供了现成的线程池。
Java里面线程池的顶级接口是Executor,是一个执行线程的工具。
线程池的接口是ExecutorService。
Executor接口:
执行已提交的Runnable任务对象。
ExecutorService接口:
提供了管理终止的方法,以及可以为了跟踪一个或多个异步任务执行状况而生成Future的方法。
Executors类:
实现类,定义的Executor、executorService等工厂和实用方法。
四类线程池:
- newSingleThreadExecutor
- newFixedThreadPool
- newCachedThreadPool
- newScheduledThreadPool
newSingleThreadExecutor:
创建一个单线程池。保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool
创建一个固定大小的线程池。每次提交线程池就创建一个线程,直到线程池满
newCachedThreadPool
创建一个可缓存的线程池。(60秒内不执行任务的线程池将会被回收)
newScheduledThreadPool
创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务需求
代码示例:
package com.lemon.ThreadDemo;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author lemonsun
*/
public class ThreadDemo5 {
public static void main(String[] args) {
//创建线程池的四种方法
//1、创建一个单线程的线程池 (用的多)
// ExecutorService es = Executors.newSingleThreadExecutor();
//2、创建固定大小的线程池 (用的多)
// ExecutorService es = Executors.newFixedThreadPool(2);
//3、创建一个可缓存的线程池,大小完全依赖于操作系统
// ExecutorService es = Executors.newCachedThreadPool();
//4、创建一个无限大小的线程池
// ExecutorService es = Executors.newScheduledThreadPool(2);//初始容量为2
ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
es.execute(new MyRunnable6()); //开始 MyRunnable6任务
es.execute(new MyRunnable6()); //开始 MyRunnable6任务
es.schedule(new MyRunnable6(),3000, TimeUnit.MICROSECONDS); //线程3秒执行
es.shutdown(); //关闭线程池*/
}
}
class MyRunnable6 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}