一、概述
- 线程池就是一个可以复用线程的技术
- 不使用线程池的问题:如果用户每发起一个请求,后台就创建一个新线程来处理,下次新任务来了又要创建新线程,而创建新线程的开销是很大的,这样会严重影响系统的性能。
- JDK5.0起提供了代表线程池的接口:ExecutorService
- 如何得到线程池对象:
- 线程池参数构造说明:
- 常见问题:
- 临时线程什么时候创建? 新线程提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建临时线程。
- 什么时候会开始拒绝任务? 核心线程和临时线程都在忙,任务队列也满了,新的任务过来的时候才会开始任务拒绝。
二、线程池处理Runnable任务
如下为示例代码:
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"输出了:HelloWorld==>"+i);
}
System.out.println(Thread.currentThread().getName()+"本任务与线程绑定,进入休眠状态~~~");
try {
Thread.sleep(100000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.util.concurrent.*;
public class ThreadPoolDemo1 {
public static void main(String[] args) {
//1、创建线程池对象
ExecutorService pool=new ThreadPoolExecutor(3,5,6,
TimeUnit.SECONDS,new ArrayBlockingQueue<>(5),Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//2、给线程池处理任务
Runnable target=new MyRunnable();
pool.execute(target);
pool.execute(target);
pool.execute(target);
//任务队列任务等待
pool.execute(target);
pool.execute(target);
pool.execute(target);
pool.execute(target);
pool.execute(target);
//创建临时线程
pool.execute(target);
pool.execute(target);
//不创建,拒绝策略被出发!
pool.execute(target);
//关闭线程池(开发中一般不会使用)
//pool.shutdowanNow();
//pool.shutdown();
}
}
执行结果如下:(第一行有异常为拒绝策略触发)
三、线程池处理Callable任务
import java.util.concurrent.Callable;
public class MyCallable implements Callable<String> {
private int n;
public MyCallable(int n){this.n=n;}
@Override
public String call() throws Exception {
int sum=0;
for (int i = 1; i <=n; i++) {
sum+=i;
}
return Thread.currentThread().getName()+"执行1~"+n+"的和为:"+sum;
}
}
import java.util.concurrent.*;
public class ThreadPoolDemo1 {
public static void main(String[] args) throws Exception {
//1、创建线程池对象
ExecutorService pool=new ThreadPoolExecutor(3,5,6,
TimeUnit.SECONDS,new ArrayBlockingQueue<>(5),Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
//2、给线程池处理任务
Future<String> f1=pool.submit(new MyCallable(100));
Future<String> f2=pool.submit(new MyCallable(200));
Future<String> f3=pool.submit(new MyCallable(300));
Future<String> f4=pool.submit(new MyCallable(400));
Future<String> f5=pool.submit(new MyCallable(500));
System.out.println(f1.get());
System.out.println(f2.get());
System.out.println(f3.get());
System.out.println(f4.get());
System.out.println(f5.get());
}
}
四、Executors工具类实现线程池