Java异步编程之ExecutorService

JDK5往后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。两者都可以被ExecutorService执行,它们的区别是:
1, execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。——实现Runnable接口
2, submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。——实现Callable接口

public class Test {
    public static void main(String[] args) {
        testScheduledThreadPool();
    }

    /**
     * newSingleThreadExecutor
     * 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务
     * 此线程池保证所有任务的执行顺序按照任务的提交顺序执行
     */
    public static void testSingleThreadExecutor(){
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        testExecutorService(executorService);
    }

    /**
     * newFixedThreadPool
     * 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
     */
    public static void testFixedThreadPool(){
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        testExecutorService(executorService);
    }

    /**
     * newCachedThreadPool
     * 此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
     */
    public static void testCachedThreadPool(){
        ExecutorService executorService = Executors.newCachedThreadPool();
        testExecutorService(executorService);
    }

    /**
     * newScheduledThreadPool
     * 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求(定时任务)
     */
    public static void testScheduledThreadPool(){
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("delay 1 seconds, and excute every 3 seconds");
            }
        },1,3, TimeUnit.SECONDS);
    }


    /**
     * 创建一个定长线程池,支持定时及周期性任务执行
     * @param executor
     */
    public static void testExecutorService(ExecutorService executor){
        for (int i = 0 ; i < 10; i++){
            final int index = i;
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(index);
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

你可能感兴趣的:(Java异步编程之ExecutorService)