Executor框架介绍
1、Executor框架提供了一个灵活的线程池实现,防止应用程序过载而耗尽内存。它是基于生产者-消费者模式的,提交任务的线程是生产者,执行任务的线程是消费者。
2、线程池
newFixedThreadPool创建一个定长的线程池,每当提交一个任务就创建一个线程,直到达到池的最大长度,这是线程池会保持长度不再变化(如果一个线程由于非预期的Exception而结束,线程池会补充一个新的线程)。
newCachedThreadPool创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活地回收空闲的线程。当需求增加时,它可以灵活的添加新的线程,而并不会对池的长度作任何限制。
newSingleThreadExecutor创建一个单线程化的executor,它只创建唯一的工作者线程来执行任务,如果这个线程异常结束,会有另一个取代它。executor会保证任务依照任务队列所规定的顺序(FIFO,LIFO,优先级)执行。
newScheduledThreadPool创建一个定长的线程池,而且支持定时的以及周期性的任务执行。
3、完成服务CompletionService
CompletionService整合了Executor和BlockingQueue的功能,你可以将Callable任务提交给它去执行,然后使用类似队列中take和poll方法,在任务结果完整可用时获得这个结果。
4、SwingUtilities.invokeAndWait,它可以安排一个Runnable任务在事件派发线程中执行,并会阻塞当前线程直到它完成(只能从非GUI线程中调用,否则会发生死锁)
SwingUtilities.invokeAndLater,它可以安排一个Runnable任务在事件派发线程中执行(可从任意线程中调用)
5、Future是被设计来处理可取消任务,所以遇到任务处理有取消需求时,可以考虑用Future
6、发生死锁的原因:两个或者多个线程企图以不同的顺序获得相同的多个锁时会发生
例子:
public class LeftRightDeadLock{
private Object left = new Object();
private Object right = new Object();
public void leftRight(){
synchronized(left){
synchronized(right){
doSomething();
}
}
}
public void rightLeft(){
synchronized(right){
synchronized(left){
doSomething();
}
}
}
}
7、Amdahl定律
Amdahl定律描述了在一个系统中,基于可并行化和串行化组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少。如果F是必须串行化执行的比重,N代表处理器数,提速公式为:
SpeedUp <= 1/ (F + (1 - F)/N)
8、创建Lock/ReentrantLock机制的意义
内部锁在大部分情况下都能很好的工作,但是有一些功能上的局限--不能中断那些等待获取锁的线程,并且在请求锁失败的情况下只能无限等待。内部锁必须在获取它的代码中释放;这很好的简化了代码,与异常处理机制能够良好的互动。但在某些情况下,一个更灵活的加锁机制提供了更好的活跃度和性能。