可以在 java.util.concurrent
中找到管理线程池的顶级接口 Executors
import java.util.concurrent.*;
Executors
接口定义了一个 execute()
方法,接收一个实例化的Runnable
对象,来启动这个任务,不过常用的还是 ExecutorService
类
ExecutorService
类继承自 Executors
,但是提供相当方便的一些方法,可以通过下面的代码来创建不同规模,不同特性的线程池,返回值是ExecutorService
对象
创建不同规模/特性的线程池
/*
构造输入 :无
返回值 : 一个ExecutorService对象
特性 : 创建灵活的线程池,如果线程池过大,会自动调整,回收一些线程
*/
Executors.newCachedThreadPool();
/*
构造输入 :int,线程池最大并发数量
返回值 : 一个ExecutorService对象
特性 : 创建固定尺寸的线程池,限制最大并发的线程数目,超出指定数目的线程会在队列中等待直到有空位
*/
Executors.newFixedThreadPool(int);
/*
构造输入 :无
返回值 : 一个ExecutorService对象
特性 : 创建单个线程的线程池,只会执行一个线程,按照先进先出执行
*/
Executors.newSingleThreadExecutor();
常见方法:
/*
submit 方法接收一个实例化的Thread或者Runnable对象,将接收对象添加进线程池
*/
submit()
/*
表示之后不再有新的线程加入了
*/
shutdown();
演示
同时用Thread派生类打印数字,用Runnable实现类来打印字母
package concurrent;
import java.util.concurrent.*;
import java.util.concurrent.Executors;
class printNumThread extends Thread
{
String thname;
printNumThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(int i=0; i<=26; i++) {
System.out.printf("Thread name: %s , print num: %d\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class printCharThread implements Runnable {
String thname;
printCharThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(char i='a'; i<='z'; i++) {
System.out.printf("Thread name: %s , print char: %c\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class mutilThread {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
printNumThread pt1 = new printNumThread("线程A");
printNumThread pt2 = new printNumThread("线程B");
printCharThread run3 = new printCharThread("线程C");
printCharThread run4 = new printCharThread("线程D");
pool.submit(pt1);
pool.submit(pt2);
pool.submit(run3);
pool.submit(run4);
pool.shutdown();
}
}