参考自:点击打开链接
在正常的工作学习中,我们通常需要执行多种操作,而一个线程一次只能执行一个任务,而这就意味着,我们需要同时使用多个线程,而同时使用多个线程需要占据很大的内存,这显然与我们期望的有所区别,所以,线程池这个概念就随之产生了。那么,什么时线程池呢?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。简而言之,线程池就是开辟出一块固定的订房用于存放线程,从而减少线程的重复创建,达到节省资源的目的。那么如何创建线程池呢?
在Java中,线程是有Executor这个类来是实现的,Executors类中支持创建四种现线程池,分别为:
1.newCachedThreadPool 创建一个无限大小的线程池,这个线程池是可缓存的线程池,如果线程池的长度超过了护处理的需求,可以灵活的回收线程。如果没有可以回收的线程,就新建一个线程。实例代码如下:
- package test;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
- for (int i = 0; i < 10; i++) {
- final int index = i;
- try {
- Thread.sleep(index * 1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- cachedThreadPool.execute(new Runnable() {
- public void run() {
- System.out.println(index);
- }
- });
- }
- }
- }
2.newFixedThreadPool 创建出一个定长的线程池,可以控制最大的线程并发数量,超出的线程会在队列中等待。实例代码如下:
- package test;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
- for (int i = 0; i < 10; i++) {
- final int index = i;
- fixedThreadPool.execute(new Runnable() {
- public void run() {
- try {
- System.out.println(index);
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- }
- }
- }
3.newScheduledThreadPool 支持定时及周期性的任务执行,代码示例如下:
- package test;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
- scheduledThreadPool.schedule(new Runnable() {
- public void run() {
- System.out.println("delay 3 seconds");
- }
- }, 3, TimeUnit.SECONDS);
- }
- }
4。 newSingleThreadExecutor 创建一个单线程的的线程池,只会用唯一的线程执行任务,所有的任务都按照顺序来执行。实例代码如下:
- package test;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- public class ThreadPoolExecutorTest {
- public static void main(String[] args) {
- ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
- for (int i = 0; i < 100; i++) {
- final int index = i;
- singleThreadExecutor.execute(new Runnable() {
- public void run() {
- try {
- while(true) {
- System.out.println(index);
- Thread.sleep(10 * 1000);
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- });
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }