- 存放线程的池子,是典型的拿空间换时间的,减少了线程的创建和销毁的时间。
package com.roocon.thread.t1;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
-
线程池
*/
public class ThreadPoolTest {public static void main(String[] args) {
/** * Executor: 线程池的最外层接口 * newFixedThreadPool:创建固定大小的线程池 * */ Executor pool = Executors.newFixedThreadPool(10); /** * 创建一个任务交给线程池去执行 */ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); /** * 既然是线程池,那么久可以创建多个线程任务交给线程池去执行 */ for(int i=0;i<9;i++){ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); }
}
}
- 理想状态,正好有10个线程,正好有10个线程任务
- 在代码中没有去手动的关闭线程池,所以即使运行结束,线程池任然没有shutdown,如图:
- 目前有线程池中有10个线程,但是如果线程任务超过了10个会怎么样呢?
package com.roocon.thread.t1;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
-
线程池
*/
public class ThreadPoolTest {public static void main(String[] args) {
/** * Executor: 线程池的最外层接口 * newFixedThreadPool:创建固定大小的线程池 * */ ExecutorService pool = Executors.newFixedThreadPool(10); /** * 创建一个任务交给线程池去执行 */ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); /** * 既然是线程池,那么久可以创建多个线程任务交给线程池去执行 */ for(int i=0;i<19;i++){ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); }
}
}
运行结果如下:
由此可以看出:再多的线程任务,也是由线程池中的这几个线程来执行的,只不过有些线程执行结束的早,然后会被拿去继续执行其他的任务而已。
- 通过newCachedThreadPool方式创建线程的区别?
package com.roocon.thread.t1;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
-
线程池
*/
public class ThreadPoolTest {public static void main(String[] args) {
/** * Executor: 线程池的最外层接口 * newFixedThreadPool:创建固定大小的线程池 * */ ExecutorService pool = Executors.newCachedThreadPool(); /** * 创建一个任务交给线程池去执行 */ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); /** * 既然是线程池,那么久可以创建多个线程任务交给线程池去执行 */ for(int i=0;i<190;i++){ pool.execute(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()); } }); }
}
}
这是一个比较人工智能的方式,如果觉得当下的线程池不够用,那么它会自动的创建,够用的话就进行回收。