java线程池之newFixedThreadPool(包括submit() 和 execute()两种方法的详解)

1、特点:

可以自定义最大线程池数量

2、创建实例:

ExecutorService executorService1 = Executors.newFixedThreadPool(3);

这里如果没有特殊需求要指定最大线程池数量的话,建议最大线程池数量=运行程序机器的cpu核心数,即

int cpuNubmer = Runtime.getRuntime().availableProcessors();
ExecutorService executorService1 = Executors.newFixedThreadPool(cpuNubmer);

3、运行举例-schedule方法

这里需要用匿名内部类的方式,实现Runnable接口,重写Runnable的run方法,将Runnable类型的参数传入schedule方法中。

        ExecutorService executorService1 = Executors.newFixedThreadPool(3);
        for (int i = 1; i < 20; i++) {
            int finalI = i;
            executorService1.execute(() -> {
                try {
                    System.out.println(finalI);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        executorService1.shutdown();

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。

4、运行举例-submit方法

        ExecutorService executorService1 = Executors.newFixedThreadPool(3);
        for (int i = 1; i < 10; i++) {
            int finalI = i;
            Future sub = executorService1.submit(() -> {
                try {
                    System.out.println(finalI);
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
            System.out.println(sub.get());
        }
        executorService1.shutdown();

因为线程池代码没有运行异常,所以sub.get()每次都会返回null

        ExecutorService executorService1 = Executors.newFixedThreadPool(10);
        try {
            Future sub = executorService1.submit(() -> System.out.println(0 / 0));
            System.out.println("result=" + sub.get());
        } catch (Exception e) {
            System.out.println(e);
        }
        executorService1.shutdown();

因为线程池代码运行异常,所以会直接执行catch代码块,打印出异常结果。

5、submit() 和 execute()方法的区别

execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)

execute() 没有返回值;而 submit() 有返回值

submit() 的返回值 Future 调用get方法时,可以捕获处理异常

 

 

你可能感兴趣的:(程序开发)