转:Java并发编程与技术内幕:线程池深入理解
版权声明:本文为博主林炳文Evankaka原创文章,转载请注明出处http://blog.csdn.net/evankaka
);
验证实例:
- public static void testCachedThreadPool() {
- System.out.println("Main: Starting at: "+ new Date());
- ExecutorService exec = Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE
- for(int i = 0; i < 10; i++) {
- exec.execute(new Handle(String.valueOf(i)));
- }
- exec.shutdown(); //执行到此处并不会马上关闭线程池,但之后不能再往线程池中加线程,否则会报错
- System.out.println("Main: Finished all threads at"+ new Date());
- }
执行结果:
从上面的结果可以看出:
);
运行结果:
; i < 10; i++) {
运行结果:
其实它也等价于以下:
- ExecutorService exec = Executors.newFixedThreadPool(1);
4、newScheduledThreadPool
这是一个计划线程池类,它能设置线程执行的先后间隔及执行时间等,功能比上面的三个强大了一些。
以下实例:
- public static void testScheduledThreadPool() {
- System.out.println("Main Thread: Starting at: "+ new Date());
- ScheduledThreadPoolExecutor exec = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(10); //创建大小为10的线程池
- for(int i = 0; i < 10; i++) {
- exec.schedule(new Handle(String.valueOf(i)), 10, TimeUnit.SECONDS);//延迟10秒执行
- }
- exec.shutdown(); //执行到此处并不会马上关闭线程池
- while(!exec.isTerminated()){
- //wait for all tasks to finish
- }
- System.out.println("Main Thread: Finished at:"+ new Date());
- }
实现每个放入的线程延迟10秒执行。
结果:
ScheduledThreadPoolExecutor的定时方法主要有以下四种:
下面将主要来具体讲讲scheduleAtFixedRate和scheduleWithFixedDelay
scheduleAtFixedRate 按指定频率周期执行某个任务
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
command:执行线程
initialDelay:初始化延时
period:两次开始执行最小间隔时间
unit:计时单位
scheduleWithFixedDelay 周期定时执行某个任务/按指定频率间隔执行某个任务(注意)
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
command:执行线程
initialDelay:初始化延时
period:前一次执行结束到下一次执行开始的间隔时间(间隔执行延迟时间)
unit:计时单位
使用实例:
- class MyHandle implements Runnable {
- @Override
- public void run() {
- System.out.println(System.currentTimeMillis());
- try {
- Thread.sleep(1 * 1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
1.按指定频率周期执行某个任务
下面实现每隔2秒执行一次,注意,如果上次的线程还没有执行完成,那么会阻塞下一个线程的执行。即使线程池设置得足够大。
- /**
- * 初始化延迟0ms开始执行,每隔2000ms重新执行一次任务
- * @author linbingwen
- * @since 2016年6月6日
- */
- public static void executeFixedRate() {
- ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
- executor.scheduleAtFixedRate(
- new MyHandle(),
- 0,
- 2000,
- TimeUnit.MILLISECONDS);
- }
);
);