通过Callable获取线程的执行结果

本文介绍如何通过Callable接口在Java中获取线程执行的结果,并演示了如何取消正在执行的任务。示例代码展示了三种不同情况的Callable任务:立即返回结果、无限循环以及抛出异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在现实生活中,我们执行线程时一般需要获取线程的结果,这时我们可以通过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!

从结果中可以看出 我们不仅可以获取线程执行的结果,还可以取消线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值