思考?
1 为什么要使用执行器和线程池?
2 执行器和线程是什么? 怎么使用
执行器
线程执行器分离了任务的创建和执行, 提高了线程的性能
线程池
避免了频繁地创建和销毁线程, 达到线程对象的重用, 可以根据项目灵活地控制并发的数量
ExecutorService (java.util.concurrent)
1 Executors.newCachedThreadPool() 可缓存线程池, 如果线程池长度超过处理需要, 可灵活回收空闲线程, 若无可回收, 则新建线程
2 Executors.newFixedThreadPool() 定长线程池, 可控制线程最大并发数, 超出的线程会在队列中等待
3 Executors.newScheduledThreadPool() 定长线程池, 支持定时及周期性任务执行
4 Executors.newSingleThreadExecutor() 单线程的线程池, 只会用唯一的工作线程来执行任务, 保证所有任务按照指定顺序 (FIFO,LIFO, 优先级) 执行
执行方法 submit 和 execute 的区别
1 接收的参数不一样 submit 参数是 Callable, execute 参数是 Runnable
2 submit 存在返回值, 可以知道线程的执行结果, 例如: 2.1
2.1 Future<String> future = excutorService.submit(任务) future.get();// 打印线程执行的结果
callable 和 runable 的区别
callable 有返回值, runable 没有返回值
shutdown 和 shutdownnow()的区别
1 shutdown()方法在终止前允许执行以前提交的任务
2 shutdownnow()方法阻止等待任务启动并试图停止当前正常执行的任务
如何合理配置线程池大小(检查任务的性质, 执行时间, 以及依赖性)
1 确定任务的性质 (CPU 密集型 ? IO 密集型 ? 混合型任务 ? )
2 确定任务的执行时间 (长 ? 短 ? 中 ?)
3 确定任务的依赖性, 是否依赖其它的系统资源 (数据连接 ?)
线程池配置方案参考
1 CPU 密集型任务 应配置尽可能少的线程数(上下文切换消耗) CPU 个数 + 1
2 IO 密集型任务 应配置尽可能多的线程数(IO 操作不占用 CPU) 两倍 CPU 个数 + 1
3 如依赖其它资源, 等待时间越长, 则 CPU 空闲时间越长, 线程数应设置得越大
4 线程等待时间所占比例越高, 需要越多线程, 线程 CPU 时间所占比例越高, 需要越少线程
来源: http://www.bubuko.com/infodetail-2654343.html