简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
🌻1. 前言
本篇目的:Java进阶之多线程任务Callable:用法实例
🌻2. Java Callable介绍
-
基本概念
Callable
是一个函数式接口,表示一个可以返回结果的任务。Callable
接口允许实现类定义一个带返回值的方法call
,用于表示任务的执行逻辑。
-
功能
- 定义任务的执行逻辑,并返回结果。
- 允许任务被线程执行,并获取任务的返回值。
-
使用限制
Callable
接口的call
方法可以抛出受检查的异常。Callable
任务需要被线程执行,通常通过FutureTask
或线程池来管理。
-
性能特性
Callable
接口提供了一种灵活的任务定义方式,支持返回值和异常处理。- 合理使用
Callable
可以提高代码的可读性和可维护性。
-
使用场景
- 广泛应用于需要定义带返回值任务的场景。
- 特别适用于需要并发执行任务并获取结果的场景。
🌻3. 代码实例
🌻3.1 使用Callable定义和执行任务
-
应用场景
- 使用
Callable
定义任务逻辑,并通过FutureTask
执行任务。
- 使用
-
用法实例
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CallableExample { public static void main(String[] args) { Callable<Integer> task = () -> { System.out.println("Task is running in thread: " + Thread.currentThread().getName()); return 42; }; FutureTask<Integer> futureTask = new FutureTask<>(task); new Thread(futureTask).start(); try { Integer result = futureTask.get(); System.out.println("Task result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }
输出:
Task is running in thread: Thread-0
Task result: 42
🌻3.2 使用Callable实现多线程任务
-
应用场景
- 使用
Callable
实现多个线程任务的并发执行,并获取结果。
- 使用
-
用法实例
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class CallableMultiThreadExample { public static void main(String[] args) { Callable<Integer> task1 = () -> { System.out.println("Task 1 is running in thread: " + Thread.currentThread().getName()); return 42; }; Callable<Integer> task2 = () -> { System.out.println("Task 2 is running in thread: " + Thread.currentThread().getName()); return 24; }; FutureTask<Integer> futureTask1 = new FutureTask<>(task1); FutureTask<Integer> futureTask2 = new FutureTask<>(task2); new Thread(futureTask1).start(); new Thread(futureTask2).start(); try { Integer result1 = futureTask1.get(); Integer result2 = futureTask2.get(); System.out.println("Task 1 result: " + result1); System.out.println("Task 2 result: " + result2); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } }
输出:
Task 1 is running in thread: Thread-0
Task 2 is running in thread: Thread-1
Task 1 result: 42
Task 2 result: 24
🌻3.3 使用Callable实现线程池任务
-
应用场景
- 使用
Callable
定义任务逻辑,并通过线程池执行任务,获取结果。
- 使用
-
用法实例
import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CallableThreadPoolExample { public static void main(String[] args) { Callable<Integer> task = () -> { System.out.println("Task is running in thread: " + Thread.currentThread().getName()); return 42; }; ExecutorService executor = Executors.newSingleThreadExecutor(); try { Integer result = executor.submit(task).get(); System.out.println("Task result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
输出:
Task is running in thread: pool-1-thread-1
Task result: 42
🌻3.4 Callable总结
关键词 | 功能描述 | 典型应用 |
---|---|---|
Callable | 定义带返回值任务的接口 | 提供任务的执行逻辑,并返回结果 |
call | 定义任务的执行逻辑 | 带返回值的方法,表示任务的执行逻辑 |
FutureTask | 管理Callable任务 | 使用FutureTask执行Callable任务,获取任务结果 |
ExecutorService | 管理线程池执行任务 | 使用线程池执行Callable任务,提高资源利用率 |
性能特性 | 提供灵活的任务定义方式 | 特别适用于需要并发执行任务并获取结果的场景 |