在线程池里面创建线程,使用线程池可以很好地提高性能,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。
4种线程池均用Executors创建:
- Executors.newCacheThreadPool()
按需创建新的线程,先查看池中有没有以前建立的线程,如果有,就重用。如果没有,就建一个新的线程加入池中,通常用于执行一些生存期很短的任务
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
//创建一个线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
Thread.sleep(1000);//每隔一秒创建一个线程
cachedThreadPool.execute(new Runnable() {
public void run() {
//打印正在执行的缓存线程信息
System.out.println(Thread.currentThread().getName()+"正在被执行");
}
});
}
}
}
- Executors.newFixedThreadPool(int n)
创建一个线程池,该线程池可并发执行的线程数固定,某一线程执行完当前任务后该线程可以被重用执行另外一任务,线程池n个线程都被占用时,其他任务按照任务的提交顺序在队列中等待
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
//创建一个可重用固定个数的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
fixedThreadPool.execute(new Runnable() { //很厉害的匿名内部类
public void run() {
try {
//打印正在执行的缓存线程信息
System.out.println(Thread.currentThread().getName()+"正在被执行");
Thread.sleep(2000); //每隔2秒轮流打印3个线程的名字
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
- Executors.newSingleThreadExecutor()
创建一个只有单线程的线程池,它只会用唯一的线程来执行任务,如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它,此线程池保证所有任务的执行顺序按照任务的提交顺序执行
public class TestThreadPoolExecutor {
public static void main(String[] args) {
//创建一个单线程化的线程池
ExecutorService singleThreadExecutor =
Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
/*index为不可变量,每一次for循环后本次final变量出了这个块的作用域范围就
会失效,下次循环的时候重建一个不同域的final变量,故不同域对应的线程使用
不同的index*/
final int index = i;
singleThreadExecutor.execute(new Runnable() {
public void run() {
try {
//结果依次输出,相当于顺序执行各个任务
System.out.println(Thread.currentThread().getName()+"正在被执
行,打印的值是:"+index);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
- Executors.newScheduledThreadPool(int n)
创建一个定长线程池,线程池里面的任务执行又分两种:定时或者周期性执行
- 定时执行
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
//创建一个定长线程池,支持定时及周期性任务执行——延迟执行
ScheduledExecutorService scheduledThreadPool =
Executors.newScheduledThreadPool(5);
//延迟1秒执行
scheduledThreadPool.schedule(new Runnable() {
public void run() {
System.out.println("延迟1秒执行");
}
}, 1, TimeUnit.SECONDS);//1秒后执行一次即over
}
}
- 周期性执行
public class ThreadPoolExecutorTest {
public static void main(String[] args) {
//创建一个定长线程池,支持定时及周期性任务执行——定期执行
ScheduledExecutorService scheduledThreadPool =
Executors.newScheduledThreadPool(5);
/*延迟1秒后执行该任务,以后每隔3秒再次执行该任务,每隔3秒若上次任务已完成则
启动本次任务,否则等上次任务结束后才启动本次任务(尽管已经到了3秒)*/
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
public void run() {
System.out.println("延迟1秒后再每3秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
}
}