使用场景:
离线任务、异步任务、大数据任务、耗时较长任务的运行**,适当地利用,可达到加速的效果。
注意:线上对响应时间要求较高的场合,尽量少用多线程,尤其是服务线程需要等待任务线程的场合(很多重大事故就是和这个息息相关),如果一定要用,可以对服务线程设置一个最大等待时间。
常用方案:
1)单机多线程,可以引入线程池的机制,目标:
- 提高性能,节省线程创建和销毁的开销;
- 限流。给线程池一个固定的容量,达到这个容量值后再有任务进来,就进入队列进行排队,保障机器极限压力下的稳定处理能力在使用JDK自带的线程池时,一定要仔细理解构造方法的各个参数的含义,如core pool size、max pool size、keepAliveTime、worker queue等,在理解的基础上通过不断地测试调整这些参数值达到最优效果;
2)多机多线程--分布式系统
引入一个单独的节点,作为调度器,其他的机器节点都作为执行器节点;
调度器来负责拆分任务,和分发任务到合适的执行器节点;
执行器节点按照多线程的方式(也可能是单线程)来执行任务;
整个任务系统就由单击演变成一个集群的系统,而且不同的机器节点有不同的角色,各司其职,各个节点之间还有交互。这个时候除了有多线程、线程池等机制,像RPC、心跳等网络通信调用的机制也不可少。