package com.lixin.test.ybl;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class ThreadDemo02 {
public static final int MAX_TURN = 5;
public static final int COMPTE_TIMES = 100000000;
// 1、创建一个callable接口的实现类
static class ReturnableTask implements Callable {
// 编写好异步执行的具体逻辑,可以有返回值
@Override
public Long call() throws Exception {
long startTime = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "线程运行开始。");
Thread.sleep(1000);
for (int i = 0; i < COMPTE_TIMES; i++) {
int j = i * 10000;
}
long used = System.currentTimeMillis() - startTime;
System.out.println(Thread.currentThread().getName() + "线程运行结束。");
return used;
}
}
public static void main(String[] args) throws InterruptedException {
// 3、
ReturnableTask returnableTask = new ReturnableTask();
// 4、
Future futureTask = new FutureTask(returnableTask);
// 5、
Thread thread = new Thread((Runnable) futureTask, "returnableThread");
thread.start();
Thread.sleep(500);
System.out.println(Thread.currentThread().getName() + "让子弹飞一会");
System.out.println(Thread.currentThread().getName() + "做一点自己的事情");
for (int i = 0; i < COMPTE_TIMES; i++) {
int j = i * 10000;
}
System.out.println(Thread.currentThread().getName() + "获取并发任务的执行结果。");
try {
// 7
System.out.println(Thread.currentThread().getName() + "线程占用时间:" + futureTask.get());
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "运行结束");
}
}
1、创建一个Callable接口的实现类,并实现其call()方法,编写好异步执行的具体逻辑,可以有返回值
2、使用Callable实现类的实例构造一个FutureTask实例
3、使用FutureTask实例作为Thread的构造器target的入参,构造新的Thread线程实例
4、调用Thread实例的start()方法启动新的线程实例,启动新线程的run()方法并发执行。其内部的执行过程为:启动Thread的run()方法并发执行后,会执行FutureTask实例的run()方法,最终会并发执行Callable实现类的call()方法。
5、调用FutureTask对象的get()方法阻塞性的获得并发执行线程的执行结果。



