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<Long> { // 编写好异步执行的具体逻辑,可以有返回值 @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<Long> futureTask = new FutureTask<Long>(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()方法阻塞性的获得并发执行线程的执行结果。