课程名称:Java体系课
章节名称:多线程的安全与应用(下)
课程内容:
- 初识线程池及其应用
- JUC
- JUC支持的线程池种类
- 启动线程池的方法
学习收获:
- JUC:java.util.concurrent
并发是伴随着多核处理器的诞生而产生的,为了充分利用硬件资源,诞生了多线程技术。但是多线程又存在资源竞争的问题,引发了同步和互斥的问题,JDK1.5推出的java.lang.concurrent(并发工具包)来解决这些问题 - Runnable接口的弊端
Runnable新建线程,性能差
线程缺乏统一管理,可能无限制的新建线程,相互竞争,严重时会占有过多系统资源导致死机或内存溢出 - 线程池
1.线程复用(跑道)
2.重用存在的线程,减少线程对象创建、消亡的开销
3.线程总数可控,提高资源的利用率
4.提高额外功能,定时执行、定期执行、监控等 - 四种线程池
在java.util.concurrent中,提供了工具类Executors(调度器)对象来创建线程池,可创建的线程池有四种
- FixedThreadPool——定长线程池
定长线程池的特点是固定线程总数,空闲线程用于执行任务,如果线程都在使用,后续任务则处于等待状态
//创建一个可创建一个定长线程池
//定长线程池的特点是固定线程总数,空闲线程用于执行任务,如果线程都在使用,后续任务则处于等待状态
ExecutorService threadPool = Executors.newFixedThreadPool(10);
for(int i = 1; i <= 1000 ; i++){
final int index = i;
//不需要返回值,使用execute方法执行Runnable对象
threadPool.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":" + index );
}
});
/*
需要返回值,使用submit方法执行Callable对象,利用Future对象接收返回值
Future<Object> ret = threadPool.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
return null;
}
});
*/
}
//处理完毕关闭线程池
threadPool.shutdown();
- CachedThreadPool——可缓存线程池
根据运行情况动态调整缓存大小,可缓存线程池无限大,如果线程池中没有可用的线程则创建,有空闲线程则利用起来
//调度器对象
//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);
}
});
}
threadPool.shutdown();
- SingleThreadPool——单线程池
全局有且只有唯一一个线程,应用较少。
//调度器对象
//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);
}
});
}
threadPool.shutdown();
- ScheduledThreadPool——调度线程池
根据实际情况决定每个任务间隔多长时间运行一次
//调度线程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);//可调度线程池
//延迟1秒执行,每三秒执行一次
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(new Date() + "延迟1秒执行,每三秒执行一次");
}
}, 1, 3, TimeUnit.SECONDS);
}
- 启动线程池的方法
1.invokeAll方法(Interface ExecutorService)
2.execute方法(Interface Executor)
3.submit方法(Interface ExecutorService)
课程截图
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦