在现实生活中,我们执行线程时一般需要获取线程的结果,这时我们可以通过Callable来实现我们的需求,代码如下
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class MyCallable implements Callable<String> {
private int flag = 0;
public MyCallable(int flag){
this.flag = flag;
}
@Override
public String call() throws Exception {
// TODO Auto-generated method stub
//==0 直接返回
if (this.flag == 0)
{
return "flag = 0";
}
//=1 死循环
if (this.flag == 1)
{
try {
while (true)
{
System.out.println("looping.");
Thread.sleep(2000);
}
}
catch (InterruptedException e)
{
System.out.println("Interrupted");
}
System.out.println("end ");
return "false";
}
// 非法参数 抛出异常
else
{
throw new Exception("Bad flag value!");
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义3个Callable类型的任务
MyCallable task1 = new MyCallable(0);
MyCallable task2 = new MyCallable(1);
MyCallable task3 = new MyCallable(2);
// 创建一个执行任务的线程池
ExecutorService es = Executors.newFixedThreadPool(3);
try {
// 提交并执行任务,任务启动时返回了一个Future对象,
Future future1 = es.submit(task1);
// 获得第一个任务的结果,如果调用get方法,当前线程会等待任务执行完毕后才往下执行
System.out.println("task1: " + future1.get());
Future future2 = es.submit(task2);
// 等待5秒后,再停止第二个任务。因为第二个任务进行的是无限循环
// System.out.println("task2: " + future2.get(2000,TimeUnit.MILLISECONDS));
Thread.sleep(5000);
System.out.println("task2 cancel: " + future2.cancel(true));
//System.out.println("task2: " + future2.get());
// 获取第三个任务的输出,因为执行第三个任务会引起异常
// 所以下面的语句将引起异常的抛出
Future future3 = es.submit(task3);
System.out.println("task3: " + future3.get());
} catch (Exception e){
System.out.println(e.toString());
}
// 停止任务执行服务
es.shutdownNow();
}
}
运行结果如下
task1: flag = 0
looping.
looping.
looping.
task2 cancel: true
Interrupted
end
java.util.concurrent.ExecutionException: java.lang.Exception: Bad flag value!
从结果中可以看出 我们不仅可以获取线程执行的结果,还可以取消线程
分享到:
相关推荐
总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...
4. **控制线程执行**:`Future`对象还提供了控制线程执行的方法,如`cancel()`方法可以尝试取消任务的执行,而`isCancelled()`和`isDone()`方法则可以用来检查任务的状态。 接下来,我们通过示例代码深入理解`...
1. 实现Callable接口:编写一个类并实现Callable接口,重写call()方法,该方法是线程执行的主要逻辑。 2. 创建FutureTask实例:FutureTask是Java并发包(java.util.concurrent)中的一个类,它是一个可以被取消的...
总结来说,通过合理的线程同步和通信机制,我们可以在多线程环境下确保主程序在所有子线程执行完毕后再继续执行,并获取每个子线程的返回结果。这有助于优化程序性能,避免数据不一致,提升整体的并发处理能力。在...
首先,定义一个多线程执行任务的类AsyncThread,里面包含三个方法:generate、doOtherThings和getResult。generate方法用于生成指定数量的线程,都放入future数组中;doOtherThings方法用于处理其他事情,例如打印...
该接口提供了一个call()方法,该方法可以返回一个值,用于获取线程执行的结果。 Callable接口的优点 使用Callable接口可以获取线程的返回值,这在某些情况下非常有用。例如,在执行一些长时间的计算任务时,可以...
我们可以通过Future的get方法来获取线程执行的结果。如果线程执行过程中出现了错误,那么Future的get方法也会抛出异常,从而可以及时地感知到线程执行中的错误。 在示例代码中,我们使用了CountDownLatch来等待所有...
`call()`方法的返回类型是你希望线程执行后返回的结果类型。例如,你可以创建一个计算平方根的Callable: ```java import java.util.concurrent.Callable; public class SquareRootCallable implements ...
当你有一个Callable任务并希望将其作为线程执行时,可以创建一个FutureTask实例,然后将这个实例传递给Executor。 下面简要说明它们之间的关系和用法: - Runnable通常用于简单的任务,不关心结果的返回。 - ...
使用Callable和Future可以实现多线程执行任务,并获取执行结果。首先,创建一个Callable任务,实现call()方法,返回执行结果。然后,使用ExecutorService.submit()方法提交Callable任务,返回一个Future对象。最后,...
Callable 和 Future 是 Java 多线程编程中两个重要的接口,它们在处理异步计算和结果获取方面发挥着关键作用。Callable 与 Runnable 相似,但具有更强大的功能,允许任务返回结果并处理异常。 Callable 接口: ...
在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...
在上述代码中,executorService是ExecutorService的一个实例,它可以管理和控制线程的执行,而Future对象则用来获取Callable任务的执行结果。 了解这些技术对于处理大型数据处理、并发编程和优化代码质量至关重要。...
总结起来,Java通过线程控制程序执行超时是通过结合线程机制、Future/Callable接口以及中断机制实现的。在设计和实现超时控制时,要考虑到基本数据类型和反射的应用,以满足各种复杂的需求。合理地使用这些工具,...
2. **Future接口**:`Future, Object>>> future` 是一个Future对象,它是用于获取Callable线程执行结果的接口。`future.get()` 方法会阻塞,直到计算完成并返回结果。 3. **ExecutorService**:`ExecutorService ...
Future接口则用于描述异步计算的结果,我们可以通过Future对象来了解任务执行情况,并获取任务执行的结果。 在实际开发中,我们可以使用Callable和Future接口来实现异步计算。例如,我们可以使用Callable接口来实现...
了解如何获取线程状态对于调试和优化多线程应用程序至关重要。在这个Java实例中,我们将深入探讨如何通过源代码来查看和分析线程的状态。下面将详细讲解相关知识点。 1. **线程状态** Java中的线程有五种基本状态...
3. `submit()`方法:用于向`ExecutorService`提交任务,如果任务是`Callable`,它将返回一个`Future`,可以通过`Future.get()`来获取任务结果。 4. `CompletionService`:可能是`ExecutorCompletionService`,它...