Java进阶DAY31-05-多线程的第三种实现方式:利用Callable接口和Future接口实现
在Java的世界里,多线程编程是一个非常重要的概念,它可以让我们的程序执行多个任务,提高程序的效率和响应速度。Java提供了多种实现多线程的方法,今天我们将要探讨的是通过Callable
接口和Future
接口来实现多线程的第三种方式。
前言
在Java中,最初的两种多线程实现方式分别是继承Thread
类和实现Runnable
接口。这两种方式都有其局限性,主要是无法直接返回执行结果。Java 5引入了Callable
接口和Future
接口,提供了一种更灵活的方式来处理并发编程,允许任务在执行完成后返回结果。
Callable接口
Callable
接口是一个泛型接口,它有一个call()
方法可以返回一个结果。与Runnable
不同,Runnable
的run()
方法不能返回结果。
定义Callable任务
要使用Callable
,首先需要定义一个实现了Callable
接口的类,指定其泛型参数为返回值的类型,然后实现call()
方法。
import java.util.concurrent.Callable;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
// 执行任务,并返回结果
return 123;
}
}
Future接口
当我们提交一个Callable
任务给线程池执行时,会返回一个Future
对象。通过这个Future
对象,我们可以了解任务的状态,并且可以获取任务执行完成后的结果。
获取Callable任务的结果
提交Callable
任务给线程池后,我们可以通过返回的Future
对象来控制任务的执行和获取结果。
import java.util.concurrent.*;
public class CallableFutureTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newCachedThreadPool();
Future<Integer> resultFuture = executor.submit(new MyCallable());
// 可以做一些其他的事情
// 获取执行结果,这个方法会阻塞,直到任务执行完成返回结果
Integer result = resultFuture.get();
System.out.println("任务结果:" + result);
executor.shutdown();
}
}
Future接口的其他方法
Future
接口提供了其他几个有用的方法,例如:
boolean cancel(boolean mayInterruptIfRunning)
: 尝试取消执行此任务。boolean isCancelled()
: 如果任务在完成前被取消,则返回true
。boolean isDone()
: 如果任务完成,则返回true
。
小结
通过Callable
和Future
接口,Java提供了一种强大的机制来处理并发编程的任务,特别是那些需要返回结果的任务。这不仅增加了编程的灵活性,还使得并发程序的管理和控制变得更加简单。
我的实战过程:
没有遇到什么阻碍,要说的话还是抛出异常忘了怎么快捷键了