它只会使用10个线程。因为我们设置了它的容量。
我们现在把这个队列容量设置为20.
我们可以看到这里它使用了20个线程。但是出了异常,这个后面我们会学习。
我们现在使用一下我们的callable:
一般我们如果是想在线程执行完以后,获得一个返回值的话,我们可以使用future这种方式。
我们发现线程池中并不会输出我们的队列的任务。
我们现在加上线程池的方法:
使用了这个方法就可以显示出我们的队列的任务了。
会启动<=cSize个线程 其它的任务就放到工作队列里。
那如果x-nworks>mSize呢?
会执行mSize个线程来执行任务,其余的执行相应的拒绝策略。
当然,我们也可以去自定义线程池拒绝策略:
我们可以在之前的demo中加上我们的自定义拒绝策略。
会输出我们自定义异常中的内容。
在实际工作中,我们可以在这里面做我们的日志打印或者邮件警告等内容。
Executor框架:
那这几种不同的创建线程池的方式有什么区别呢?
线程池的使用建议:
创建这样的一个类。
然后我们去给它设置最大的堆内存:
然后我们去运行它:
会报异常。
我们会在之前设置的路径中找到这个文件。
这里我们可以用我们这个工具来分析这个oom异常:
我们点击接受。
找到之前的文件。
我们可以看到我们的占用情况,这里我们就不详细介绍这个工具的使用了。
这样的一个代码我们也会产生内存溢出。
这样一段代码,我们的代码中存在异常。
用submit并没有给我们输出什么异常。
我们现在改用execute来运行:
就会给我们报出异常。
这种情况下submit也会给我们造成异常。