多进程使用(二)
线程状态
yield()只是使当前线程重新回到runnable状态
sleep()会让出cpu,不会释放锁
join()会让出cpu,释放锁
wait() 和 notify() 方法与suspend()和 resume()的区别在于wait会释放锁,suspend不会释放锁
wait() 和 notify()只能运行在Synchronized代码块中,因为wait()需要释放锁,如果不在同步代码块中,就无锁可以释放
当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),
进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒
ThreadPoolExecutor方法
线程池核心参数
1、corePoolSize 要保留在池中的线程数,也就是线程池核心池的大小;
2、maximumPoolSize 最大线程数;
3、keepAliveTime 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间;
4、unit keepAliveTime 参数的时间单位;
5、workQueue 用来储存等待执行任务的队列;
6、threadFactory 线程工厂;
7、handler 默认的拒绝执行处理程序。
参数含义
1、corePoolSize:指定了线程池中的线程数量;
2、maximumPoolSize:指定了线程池中的最大线程数量;
3、keepAliveTime:当前线程池数量超过 corePoolSize 时,多余的空闲线程的存活时间,即多次时间内会被销毁;
4、unit:keepAliveTime 的单位;
5、workQueue:任务队列,被提交但尚未被执行的任务;
6、threadFactory:线程工厂,用于创建线程,一般用默认的即可;
7、handler:拒绝策略,当任务太多来不及处理,如何拒绝任务。
拒绝策略
JDK 内置的拒绝策略如下:
1、AbortPolicy : 直接抛出异常,阻止系统正常运行。
2、CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
3、DiscardOldestPolicy : 丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。
4、DiscardPolicy : 该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢失,这是最好的一种方案。
5、以上内置拒绝策略均实现了 RejectedExecutionHandler 接口,若以上策略仍无法满足实际需要,完全可以自己扩展 RejectedExecutionHandler 接口。