欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-16 18:33:23
...

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方法时,可以捕获处理异常

 

 

相关标签: 程序开发