背景:在日常进行多线程的开发过程中,遇见了有的线程池用excute提交子线程任务,有的使用submit提交线程任务。execute和submit都属于线程池的方法,那这两种有什么区别呢
?我们一起来验证一下。
1、参数和返回值上的区别
-
excute只能提交Runnable,无返回值
-
submit既可以提交Runnable,返回值为null,也可以提交Callable,返回值Future
2、异常抛出不同
2.1excute提交
package com.atguigu.signcenter.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 测试线程池.execute()是否抛出异常
* @author: jd
* @create: 2024-09-04
*/
public class ThreadPoolDemo {
public static void test() throws InterruptedException, ExecutionException {
//创建线程池对象
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(() -> {
System.out.println("========开始========");
int i = 10 / 0;
System.out.println("========结束========");
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
test();
}
}
结果:直接抛出错误
2.2submit:
只是使用submit提交不会抛出错误,submit 增加Future的get方法的时候才会抛出错误
package com.atguigu.signcenter.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 测试线程池.execute()是否抛出异常
* @author: jd
* @create: 2024-09-04
*/
public class ThreadPoolDemo {
public static void test() throws InterruptedException, ExecutionException {
//创建线程池对象
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
/* singleThreadExecutor.execute(() -> {
System.out.println("========开始========");
int i = 10 / 0;
System.out.println("========结束========");
});
*/
singleThreadExecutor.submit(() -> {
System.out.println("========开始========");
int i = 10 / 0;
System.out.println("========结束========");
});
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
test();
}
}
结果:未报错
submit 增加Future的get方法的时候抛出错误:
package com.atguigu.signcenter.thread;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 测试线程池.execute()是否抛出异常
* @author: jd
* @create: 2024-09-04
*/
public class ThreadPoolDemo {
public static void test() throws InterruptedException, ExecutionException {
//创建线程池对象
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
/* singleThreadExecutor.execute(() -> {
System.out.println("========开始========");
int i = 10 / 0;
System.out.println("========结束========");
});
*/
Future<?> submit = singleThreadExecutor.submit(() -> {
System.out.println("========开始========");
int i = 10 / 0;
System.out.println("========结束========");
});
//报错行
Object o = submit.get();
singleThreadExecutor.shutdown();
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
test();
}
}
结果:
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。