java怎么获取线程的结果_通过Callable获取线程的执行结果

本文通过实例演示如何在Java中使用多线程,并展示了如何利用Callable接口获取线程执行结果,以及如何取消正在执行的任务。

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

在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应该能够编写简单的多线程程序。

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

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对象,原文:http://blog.youkuaiyun.com/luoweifu/article/details/46673975  作者:luoweifu  转载请标名出处 《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。

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、付费专栏及课程。

余额充值