java所有线程都是通过Callable和Runnable和Thread实现的
Future
和 FutureTask
的区别和超时功能
1. Future
Future
是一个接口,主要用于:
- 获取任务的执行结果
- 检查任务是否完成
- 取消任务
方法:
get()
:获取任务执行结果。如果任务未完成,该方法会阻塞直到任务完成。get(long timeout, TimeUnit unit)
:带超时功能的get()
方法,如果任务在指定的时间内未完成,则抛出TimeoutException
。
超时功能:
Future
提供的 get(long timeout, TimeUnit unit)
方法支持超时机制,避免任务长时间阻塞主线程。若任务在指定时间内未完成,会抛出 TimeoutException
。
2. FutureTask
FutureTask
是 Future
的实现类,并且实现了 Runnable
接口。相比于 Future
,FutureTask
提供了更多功能:
- 可以作为
Runnable
提交给Thread
或ExecutorService
执行。 - 提供了任务状态管理、任务取消、异常处理等功能。
增强功能:
isDone()
:检查任务是否已经完成(无论是正常完成还是被取消)。isCancelled()
:检查任务是否已被取消。cancel(boolean mayInterruptIfRunning)
:取消任务的执行,如果任务正在执行且支持中断,则尝试中断任务。- 任务异常处理:如果任务抛出异常,
get()
方法会抛出ExecutionException
,开发者可以捕获并处理。
超时功能:
FutureTask
继承了 Future
,因此同样支持 get(long timeout, TimeUnit unit)
方法,支持超时机制。
3. 超时功能总结
Future
和FutureTask
都支持get(long timeout, TimeUnit unit)
方法,用于设置超时等待任务的结果。- 如果任务在指定的时间内未完成,
get()
会抛出TimeoutException
,从而避免阻塞。 - 超时机制在处理可能执行时间较长或不确定的任务时非常重要,能够确保系统不会因为任务过长而一直阻塞。
Callable
和 Runnable
知识
1. Runnable
Runnable
是一个函数式接口,定义了一个 run()
方法,表示可以被执行的任务。它不能返回结果,也不能抛出检查异常(checked exceptions
)。
使用场景:
- 适用于不需要返回值的任务。
- 可以通过
Thread
或ExecutorService
来执行。
Runnable task = () -> {System.out.println("Task is running");
};
Thread thread = new Thread(task);
thread.start();