线程池的作用:
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高效率,当需要执行任务时候,不需要创建的新的线程,只需要到现场池调用即可,任务的执行效率大大提升。
- 提高对线程的管理,一味的创建的新的线程不仅浪费资源,而且不利于管理,线程池可以对线程进行统一的管理等。
线程池的使用:
1 Java中的四种线程池
(1) newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
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() { @Override public void run() { System.out.println(index); } });
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2)newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
for (int i = 0; i <10 ; i++) {
int index = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
因为线程池大小为5,每个任务输出index后sleep 1秒,所以每1秒打印5个数字.
(3)newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(index);
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
结果依次输出,相当于顺序执行各个任务
(4)newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
创建定长线程池,支持定时及周期性任务执行
延迟执行:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("5秒后出现");
}
}, 5, TimeUnit.SECONDS);
}
定期执行:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("延迟1秒后每3秒执行一次"); } }, 1, 3, TimeUnit.SECONDS); }
延迟1秒后每3秒执行一次
浙公网安备 33010602011771号