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