这本书第二第三章讲的都是线程同步的东西:第二章将synchnizend,lock,wait,notify等等,第三章讲的是线程同步辅助类:clickbarraer,countdownlatch。phaser。exchangger类。
1. 线程执行器:注意是什么?平时我们都是把runable放入thread 里面。
缺点是:每一个runable都要有一个thread;创建太多的thread,也就是说创建太多的线程,系统负载过重。
所以用线程执行器:这个就不用创建每一个thread了,只需要new出runable,然后放置到执行器里面执行。有三种方案
2.ThreadPoolExecutors类,他的对象就是线程执行器。提供的四个构造器或者使用executors工厂类来创建Threadpoolexecutor对象。这个类有一个特性,就是你需要显式的去终止它。什么意思,就是说,如果没有任务放到执行器里面,执行企业会继续执行,不会结束。
四个构造器是那四个:
A:第一个是来一个任务就起一个线程,空闲了会回收无用的。
B:第二个是创建一个固定的线程个数,请根据具体资源能力来定。
C:第三个是只创建一个线程的执行器,就是说只有一个线程。保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
D:第四种就是下面的周期的。一个是未来定期执行;一个是重复执行。
ThreadPoolExecutors类的对象调用invokeany()方法。执行一个list。list里面放很多callable,将返回第一个正确执行,并且没有抛出异常的结果。
ThreadPoolExecutors类的对象调用invokeall()方法。执行一个list。list里面放很多callable,将返回所有的线程执行,list《future《String》》 封装起来。
执行器种延迟执行任务:ScheduledThreadPoolExecutor类。定时执行,如果执行器调用shutdown方法,默认情况是会执行完里面所有的任务才会停止。可以通过一个方法来改。
循环周期的执行用ScheduledExecutorService类
在执行器种取消任务,可以在Future接口来取消任务。Future 《String 》 result.cancel(true)来取消。如果任务执行完了,那么取消不了。如果正在执行,那么看参数,参数如果是true,那么任务取消。停止执行,如果参数是false,那么不会停止执行。如果任务没有执行,那么任务就取消了。不会执行了。