一、newSingleThreadExecutor (单线程的线程池)
ExecutorService executor = Executors.newSingleThreadExecutor();
通过上面的创建语句,即可创建好一个线程池,但是该线程池只支持装载一个线程,也就是说每次只有一个线程在运行。
向线程池中添加线程实例:
public static void main(String[] args) {
//1、创建单线程的线程池
ExecutorService executor =Executors.newSingleThreadExecutor();
//2、创建10个线程
for (int i = 0; i < 10; i++) {
final int no =i;
Runnable runnable = new Runnable(){
public void run() {
try {
System.out.println("into : "+ no);
Thread.sleep(1000L);
System.out.println(" end : "+ no);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//3、向线程池中装载线程
executor.execute(runnable);
}
executor.shutdown();
System.out.println(" Thread Main end!");
}
二、newCachedThreadPool (具有缓存功能的线程池)
创建线程池:
ExecutorService executor = Executors.newCachedThreadPool();
使用缓存线程池的方式跟上面的类似。
三、newFixedThreadPool (创建固定线程数的线程池)
顾名思义就是可以指定线程数量的线程池,如果线程池只能接收5个线程同时运行,那当添加到第6个线程时,第6个线程将会处理等待状态且不会被执行。
只有当线程池里有一个线程执行结束才会执行第6个线程,其他线程以此类推。
该线程池的特点就是可以指定同时运行的线程数量,对于线程池大小以外的线程则处理等待状态,也就是处于排队的状态。
看下面的实例:
public static void main(String[] args) {
//创建容纳5个线程的线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
//创建200个测试线程
for (int i = 0; i < 200; i++) {
final int no =i;
Runnable runnable = new Runnable(){
public void run() {
try {
System.out.println("into : "+ no);
Thread.sleep(1000);
System.out.println("end : " +no);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
//加载线程到线程池
executor.execute(runnable);
}
executor.shutdown();
System.out.println("main thread end!");
}
注:以上例子摘自《JAVA并发编程从入门到精通》张振华书籍