线程池的两种提交方式

2024-01-02 20:45:59

线程池是一种并发编程的机制,用于管理和重用线程,以提高应用程序的性能和效率。Java中的ExecutorService是线程池的一个接口,它提供了两种主要的方法来提交任务:execute()submit()

1. execute() 方法:

void execute(Runnable command);

  • 参数: 接受一个Runnable接口的实例,表示要执行的任务。

  • 返回值: 该方法返回void,即不返回执行结果。

  • 使用场景: 适用于那些不需要返回结果的任务,通常是一些简单的异步操作。

  • 示例

ExecutorService executor = Executors.newFixedThreadPool(5); 
executor.execute(() -> { 
// 执行任务的代码 
}); 
executor.shutdown();

?爆红了,确实不能返回

2. submit() 方法:

Future<T> submit(Callable<T> task);

Future<T> submit(Runnable task, T result);

Future<?> submit(Runnable task);

  • 参数:

    • Callable<T>:接受一个Callable接口的实例,表示要执行的任务,并返回一个Future对象,可以通过该对象获取任务的执行结果。
    • Runnable:接受一个Runnable接口的实例,表示要执行的任务,可以返回一个Future对象,但该对象的get()方法总是返回null
    • Runnable + T:与上一种类似,但可以提供一个结果作为参数,表示任务成功完成时的结果。
  • 返回值:

    • Future<T>:表示异步计算的结果,可以通过调用get()方法获取任务执行的结果。
  • 使用场景: 适用于需要获取任务执行结果的场景,可以方便地使用Future来获取异步任务的结果。

  • 示例

ExecutorService executor = Executors.newFixedThreadPool(5);

Future<String> futureResult = executor.submit(() -> {
    // 执行任务的代码
    return "Task completed";
});

try {
    String result = futureResult.get();
    System.out.println(result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

executor.shutdown();

?

总的来说,execute()适用于不需要返回结果的简单任务,而submit()适用于需要获取任务执行结果的情况。选择使用哪种方法取决于你的具体需求。

文章来源:https://blog.csdn.net/m0_62645012/article/details/135348570
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。