submit()和 execute()方法的区别
execute
方法执行完成后没有返回值,而submit
方法执行后有返回值- 方法所在的类不同,
execute
方法:java.util.concurrent.Executor
;
submit
方法:java.util.concurrent.ExecutorService
- 所需要的参数不同,
execute
: java.util.concurrent.Executor#execute(java.lang.Runnable)
submit
: java.util.concurrent.ExecutorService#submit(java.lang.Runnable, T)
,
java.util.concurrent.ExecutorService#submit(java.lang.Runnable)
java.util.concurrent.ExecutorService#submit(java.util.concurrent.Callable<T>)
代码示例
- 无返回值的
java.util.concurrent.Executor#execute(java.lang.Runnable)
@Test
public void testExecute() {
executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++) {
final int index = i;
executorService.execute(() -> System.out.println(Thread.currentThread().getName() + "-" + index));
}
executorService.shutdown();
}
- 有返回值的
java.util.concurrent.ExecutorService#submit(java.lang.Runnable)
@Test
public void testSubmit() {
List<Future<String>> res = new ArrayList<>();
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int ind = i;
Future<String> submit = executorService.submit(() -> {
System.out.println(ind + " --> return String....");
return "结果:" + ind;
});
res.add(submit);
}
res.forEach(r -> {
try {
System.out.println("res->" + r.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
}
- 有返回值的
java.util.concurrent.ExecutorService#submit(java.lang.Runnable, T)
@Test
public void testSubmit2() {
List<Future<String>> res = new ArrayList<>();
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int ind = i;
String temp = "结果2:" + ind;
Future<String> submit = executorService.submit(new Runnable() {
@Override
public void run() {
System.out.println(ind + " --> return String....");
}
}, temp);
res.add(submit);
}
res.forEach(r -> {
try {
System.out.println("res->" + r.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
}
- 有返回值的
java.util.concurrent.ExecutorService#submit(java.util.concurrent.Callable<T>)
@Test
public void testCallable() throws InterruptedException {
List<Future<String>> res = new ArrayList<>();
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int ind = i;
Future<String> submit = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println(ind + " --> return String....");
return "结果:" + ind;
}
});
res.add(submit);
}
res.forEach(r -> {
try {
System.out.println("res->" + r.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
});
Thread.sleep(40);
}