在现实生活中,我们执行线程时一般需要获取线程的结果,这时我们可以通过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!
从结果中可以看出 我们不仅可以获取线程执行的结果,还可以取消线程
分享到:
评论