首先还是和普通线程池创建的过程一样,指定线程名,核心线程数,最大线程数,队列,拒绝策略,最大空闲时间,下面我用的创建线程池的默认队列方法 是根据我们的队列大小来默认的,
这里的注意点是线程数的设定应该是处理器数的一半(也不是强制要求),LinkedBlockingQueue基于链表的无界阻塞队列(其实最大容量为Interger.MAX),你可以给定队列大小, SynchronousQueue一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。
好了,我们不是来说这个的,线程池创建完成后,我们可以通过个计数器CountDownLatch来控制线程的后续执行,
接着我们通过个死循环,不停的向线程池发送任务 任务完成再跳出,跳出的时候看计数器里的线程有没有执行完,执行完了再执行后续的操作,否则进入await等待,
好了,这是总体流程,那提交后线程池内部怎么操作呢?这里注意我们给个结束的标志作为参数给线程池以便告诉他啥时候结束;然后我们看线程池的call方法
在里面写上我们的逻辑,如果结束标志为FALSE则返回FALSE继续执行,直到结束标志为true,将CountDownLatch计数器减一, 如果不是很好理解,可以看下代码,应该就很清晰了,里面的逻辑具体场景具体分析,比如你有一个变量需要随着分析进行变化,那么你就要考虑锁啊还是啥的,看我们这返回结果
这里我们的拒绝策略是主线程执行,也就是不丢弃数据,