线程池介绍
来源:互联网 发布:微信朋友圈网络出错 编辑:程序博客网 时间:2024/05/16 03:41
什么是线程池?线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。作用类似于数据库连接池。
Java中线程池的体系结构如下:
java.util.concurrent.Executor : 负责线程的使用与调度的根接口
|–ExecutorService Executor的子接口: 线程池的主要接口
|–ThreadPoolExecutor ExecutorService的实现类
|–ScheduledExecutorService ExecutorService的子接口:负责线程的调度
|–ScheduledThreadPoolExecutor :既继承了ThreadPoolExecutor,同时实现了ScheduledExecutorService
在实际使用过程中,我们不需要自己手动new出线程池,juc的工具类Executors为我们提供了方法用以创建线程池:
ExecutorService newFixedThreadPool() : 创建固定大小的线程池
ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
ExecutorService newSingleThreadExecutor() : 创建单个线程池。线程池中只有一个线程
ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程池,可以延迟或定时的执行任务。
下面演示使用Executors.newFixedThreadPool()方法创建线程池:
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TestThreadPool { public static void main(String[] args) throws Exception { // 1. 创建线程池 ExecutorService pool = Executors.newFixedThreadPool(5); ThreadPoolDemo tpd = new ThreadPoolDemo(); // 2. 为线程池中的线程分配任务 for (int i = 0; i < 10; i++) { pool.submit(tpd); } // 3. 关闭线程池 pool.shutdown(); }}class ThreadPoolDemo implements Runnable { private int i = 0; @Override public void run() { while (i <= 100) { System.out.println(Thread.currentThread().getName() + " : " + i++); } }}
程序运行结果:
除了像上面这段代码中一样使用runnable为线程池中的线程分配任务外,还可以使用callable:
import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;public class TestThreadPool { public static void main(String[] args) throws Exception { //1. 创建线程池 ExecutorService pool = Executors.newFixedThreadPool(5); List<Future<Integer>> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { Future<Integer> future = pool.submit(new Callable<Integer>(){ @Override public Integer call() throws Exception { int sum = 0; for (int i = 0; i <= 100; i++) { sum += i; } return sum; } }); list.add(future); } pool.shutdown(); for (Future<Integer> future : list) { System.out.println(future.get()); } }}
程序运行结果:
最后总结一下创建线程的四种方式:
1. 继承Thread
2. 实现runnable
3. 实现callable
4. 使用线程池
- JAVA线程池介绍
- ThreadPoolExecutor 线程池 介绍
- 线程池的介绍
- Java线程池介绍
- Java线程池介绍
- Java线程池介绍
- java 线程池介绍
- Java线程池介绍
- Elasticsearch线程池介绍
- 线程池介绍
- 线程池介绍
- 线程池相关介绍
- android线程池介绍
- 线程池介绍
- 线程池的介绍
- java 线程池介绍
- Android线程池介绍
- C#线程与线程池使用介绍
- linux的gdb总结
- 产品研发记录05:产品研发人员应当具备的特质
- Android studio2.2.3 支持Java8
- C与C++文件的相互引用
- Python利用openpyxl库遍历Sheet的方法
- 线程池介绍
- 分布式数据访问层(DAL)
- hbase空间清理
- TCP UDP 的区别
- 聊一聊JS变量
- linux系统下文本乱码问题/基础命令
- 寒假捣鼓(一)
- linux下语法高亮设置
- leetcode -- 230. Kth Smallest Element in a BST 【遍历 + 计数】