进阶day06-可以获取子线程结果的Callable接口
This commit is contained in:
13
javaSE-day06/src/com/inmind/callable02/CallableImpl.java
Normal file
13
javaSE-day06/src/com/inmind/callable02/CallableImpl.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package com.inmind.callable02;
|
||||||
|
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
public class CallableImpl implements Callable<Integer> {
|
||||||
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
|
//线程要执行的任务
|
||||||
|
Thread thread = Thread.currentThread();
|
||||||
|
System.out.println(thread.getName()+"线程在执行call方法");
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
43
javaSE-day06/src/com/inmind/callable02/Demo01.java
Normal file
43
javaSE-day06/src/com/inmind/callable02/Demo01.java
Normal file
@@ -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<Integer> 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("程序结束");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user