JAVA基础—并发工具包与连接池
2018-08-07 本文已影响2人
东方舵手
ThreadPool — 线程池
- 重用存在的线程,减少对象、消亡的开销
- 线程总数可控,提高资源的利用率
- 避免过多资源竞争,避免阻塞
- 提供额外功能,定时执行,定期执行,监控等
线程池的种类
- 在java.util.concurrent中,提供了工具类Executors(调度器)对象来创建线程池,可创建的线程池有四种:
- CachedThreadPool — 可缓存线程池
- FixedThreadPool — 定长线程池
- SingleThreadExecutor — 单线程池
- ScheduledThreadPool — 调度线程池
1. CachedThreadPool 例子
/**
* 可缓存线程池
*/
public class CachedThreadPoolSample {
public static void main(String[] args) {
//调度器对象 ExecutorService用于管理线程池
//创建一个可缓存线程池, 可缓存线程池的特点是,无限大,如果线程池中没有可用的线程则创建,有则使用空闲的线程
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 1;i<=1000;i++){
final int index = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : " + index);
}
});
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭线程池
threadPool.shutdown();
}
}
运行结果
...
pool-1-thread-217 : 718
pool-1-thread-90 : 717
pool-1-thread-218 : 713
pool-1-thread-28 : 714
pool-1-thread-3 : 712
pool-1-thread-219 : 703
pool-1-thread-32 : 710
pool-1-thread-88 : 709
2. FixedThreadPool — 定长线程池
/**
* 定长线程池
*/
public class FixedThreadPoolSample {
public static void main(String[] args) {
//调度器对象 ExecutorService用于管理线程池
//创建一个定长线程池,固定线程总数,空闲线程用于执行任务,如果线程都在使用后续任务则处于等待状态
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//如果任务处于等待的状态,备选的等待算法默认为FIFO(先进先出)。 LIFO(后进先出)
for (int i = 1;i<=1000;i++){
final int index = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : " + index);
}
});
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭线程池
threadPool.shutdown();
}
}
运行结果
...
pool-1-thread-1 : 997
pool-1-thread-1 : 998
pool-1-thread-1 : 999
pool-1-thread-1 : 1000
pool-1-thread-2 : 740
pool-1-thread-3 : 972
3. SingleThreadExecutor — 单线程池
/**
* 单线程线程池
*/
public class SingleThreadPoolSample {
public static void main(String[] args) {
//调度器对象 ExecutorService用于管理线程池
//创建一个单线程线程池
ExecutorService threadPool = Executors.newSingleThreadExecutor();
for (int i = 1;i<=1000;i++){
final int index = i;
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " : " + index);
}
});
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭线程池
threadPool.shutdown();
}
}
运行结果
pool-1-thread-1 : 994
pool-1-thread-1 : 995
pool-1-thread-1 : 996
pool-1-thread-1 : 997
pool-1-thread-1 : 998
pool-1-thread-1 : 999
pool-1-thread-1 : 1000
4. ScheduledThreadPool — 调度线程池
/**
* 调度线程池
*/
public class ScheduledThreadPoolSample {
public static void main(String[] args) {
//创建可调度线程池 初始化5个线程
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//延迟三秒 只执行一次run()方法
scheduledThreadPool.schedule(new Runnable() {
@Override
public void run() {
System.out.println("延迟3秒执行");
}
}, 3, TimeUnit.SECONDS);
//延迟1秒执行,每三秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(new Date() + "延迟1秒执行,每三秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
/**
* 项目实际开发中ScheduledExecutorService 与 Timer都不会用到
* 因为有成熟的调度框架quartz , 或者spring自带调度
* 程序的调度框架支持一种表达式 Cron表达式
*/
}
}
运行结果
Tue Aug 07 13:00:01 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:04 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:07 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:10 CST 2018延迟1秒执行,没三秒执行一次
Tue Aug 07 13:00:13 CST 2018延迟1秒执行,没三秒执行一次