diff --git a/javaSE-day06/src/com/inmind/callable02/CallableImpl.java b/javaSE-day06/src/com/inmind/callable02/CallableImpl.java new file mode 100644 index 0000000..2a26772 --- /dev/null +++ b/javaSE-day06/src/com/inmind/callable02/CallableImpl.java @@ -0,0 +1,13 @@ +package com.inmind.callable02; + +import java.util.concurrent.Callable; + +public class CallableImpl implements Callable { + @Override + public Integer call() throws Exception { + //线程要执行的任务 + Thread thread = Thread.currentThread(); + System.out.println(thread.getName()+"线程在执行call方法"); + return 100; + } +} diff --git a/javaSE-day06/src/com/inmind/callable02/Demo01.java b/javaSE-day06/src/com/inmind/callable02/Demo01.java new file mode 100644 index 0000000..9ae66af --- /dev/null +++ b/javaSE-day06/src/com/inmind/callable02/Demo01.java @@ -0,0 +1,43 @@ +package com.inmind.callable02; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +/* +我们主线程是否可以获取子线程运行结束后的执行结果??? +使用继承Thread和实现Runnable都不行,要使用Callable,配合FutureTask类来启动线程 + + +FutureTask 是Runnable的实现类,FutureTask构造方法接收Callable对象, +通过FutureTask作为参数传给Thread,就可以将Callable接口实现类作为Thread的目标任务去执行 + +获取子线程的结果的使用步骤: +1.定义Callable的实现类 +2.创建FutureTask类对象,并以Callable的实现类作为参数 +3.创建线程对象,并以FutureTask类作为参数 +4.启动线程,在FutureTask对象中通过get方法获取子线程的结果 + */ +public class Demo01 { + public static void main(String[] args) { + //创建Callable的实现类 + CallableImpl callable = new CallableImpl(); + //创建FutureTask类对象 + FutureTask futureTask = new FutureTask<>(callable); + //创建线程对象,并以FutureTask类作为参数 + Thread thread = new Thread(futureTask,"子线程123"); + thread.start(); + + //在FutureTask对象中通过get方法获取子线程的结果 + Integer result = null; + try { + //阻塞方法,它会等着子线程执行结束,返回了结果之后才继续运行 + result = futureTask.get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + System.out.println(result);//100 + + System.out.println("程序结束"); + + } +}