前面写了【线程池execute方法的源码解析】和【线程池submit方法源码解析】,在这里简单记下execute方法与submit方法的区别。
方法传参
execute方法只能传Runnable对象
void execute(Runnable command);
submit方法可以传Runnable对象和Callable对象
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
Future<?> submit(Runnable task);
方法返回值
execute方法传递Runnable 对象,重写的run方法是由void修饰的,没有返回值;
submit方法传Runnable对象时,也是没有返回值的,但是传递Callable对象时,重写的是call方法,它是有返回值的。
对异常的处理
execute方法会直接抛出异常;
package com.su.mybatis.oracle.controller;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test {
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
for(int i = 0;i<3;i++){
final int num = i;
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
if(num ==2) {
System.out.println(1/0);
}else {
System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
}
}
});
}
fixedThreadPool.shutdown();
System.out.println("main执行完成");
}
}
输出结果:
pool-1-thread-1正在执行,num = 0
main执行完成
pool-1-thread-2正在执行,num = 1
Exception in thread "pool-1-thread-3" java.lang.ArithmeticException: / by zero
at com.su.mybatis.oracle.controller.Test$1.run(Test.java:16)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
submit方法不会直接抛出,异常会赋值给outcome字段,但是你可以使用future.get()获得。
package com.su.mybatis.oracle.controller;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
@SuppressWarnings({ "unchecked", "rawtypes", "unused" })
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
for(int i = 0;i<3;i++){
final int num = i;
Future<Boolean> future = fixedThreadPool.submit(new Callable() {
@Override
public Boolean call() throws Exception {
if(num ==2) {
System.out.println(1/0);
}else {
System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
}
return true;
}
});
}
fixedThreadPool.shutdown();
System.out.println("main执行完成");
}
}
输出结果:
main执行完成
pool-1-thread-2正在执行,num = 1
pool-1-thread-1正在执行,num = 0
使用future.get()获取异常
package com.su.mybatis.oracle.controller;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Test {
@SuppressWarnings({ "unchecked", "rawtypes"})
public static void main(String[] args) {
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
for(int i = 0;i<3;i++){
final int num = i;
Future<Boolean> future = fixedThreadPool.submit(new Callable() {
@Override
public Boolean call() throws Exception {
if(num ==2) {
System.out.println(1/0);
}else {
System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
}
return true;
}
});
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
fixedThreadPool.shutdown();
System.out.println("main执行完成");
}
}
输出结果:
pool-1-thread-1正在执行,num = 0
true
pool-1-thread-2正在执行,num = 1
true
java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:188)
at com.su.mybatis.oracle.controller.Test.main(Test.java:28)
Caused by: java.lang.ArithmeticException: / by zero
at com.su.mybatis.oracle.controller.Test$1.call(Test.java:20)
at com.su.mybatis.oracle.controller.Test$1.call(Test.java:1)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
main执行完成
如果有写的不对的地方,请大家多多批评指正,非常感谢!