老生常谈…对于大佬们根本都不用看的博客!
对于像我这种菜鸡还是得一步一步的来!如果有错误请大佬们指点指点
线程池
简介
实际场景下,我们会经常创建和销毁线程,对性能影响特别大,所以我们想提前创建很多个线程,放在一个容器里,当我们使用的时候,从里面直接获取,这样我们就避免频繁的创建和销毁线程。所以这就是线程池的由来。
优点
- 提高响应速度(减少创建线程的时间)
- 减低资源消耗(重复利用线程池中的线程)
- 便于线程管理
相关API
Executors工具类
// 创建一个线程池
public static ExecutorService newCachedThreadPool()
// 创建指定线程个数的线程池
public static ExecutorService newFixedThreadPool(int nThreads)
// 创建只有1个线程的线程池
public static ExecutorService newSingleThreadExecutor()
// 创建一个可以用于定时、周期任务的并指定线程个数的线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
ExecutorService接口
// 提交任务,交给线程池中的线程执行
Future<?> submit(Runnable task);
// 提交任务,交给线程池中的线程执行
<T> Future<T> submit(Callable<T> task);
// 关闭线程池
void shutdown();
Callable
简介
Runnable接口是一个无返回值的数据,有时我们需要将数据运行完后进行数据返回,所以诞生了更强大的Callable接口。
优势
- 具有返回值
- 可以抛出异常
- 支持泛型
- 与FutureTask类进行配合
废话不多说,直接上代码:
public class TestCallable implements Callable {
@Override
public String call() throws Exception {
return "Love Live";
}
}
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(2);
Future<String> submit = executorService.submit(new TestCallable());
String s = submit.get();
System.out.println(s);
executorService.shutdown();
}
}
ThreadPoolExecutor
简介
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
-
corePoolSize:核心线程数量(线程池中长期存活的线程数)
-
maximumPoolSize:线程池中的最大线程数量(线程池中最多存放的线程数量)
-
keepAliveTime:存活时间(临时线程多长时间不被使用会被销毁)
-
unit:存活时间单位
-
workQueue:任务队列(任务过多时,不被执行的任务放入该队列里)
-
threadFactory:创建线程工厂(一般采用Executors.defaultThreadFactory()的方法)
-
handler:拒绝策略