人之所以痛苦,那是因为你在成长。--------magic_guo
在java中面向对象多态的形式无处不在,把握好几处关键慢慢去推理,总能水落石出;以此告诫自己,切不可急躁;殊不知慢慢来才是最快的方法。
/*
* 创建线程的方式三:实现Callable接口的方式 ----> JDK 5.0新增
* 个人理解:
* 以压栈的方式理解“实现Callable接口的方式来创建线程”
* 1. Thread t1 = new Thread(futureTask);
* Thread类实现了Runnable接口,必须重写Runnable接口的run()方法
* 在Thread类中有一个属性是Runnable类型的,也创建了一个接受Runnable对象的构造器
* 调用Thread的start方法,又调用了Thread的start0()方法,开启了Thread的run方法,
*
* 2. FutureTask futureTask = new FutureTask(numThread);
* 由于FutureTask类实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable接口;
* 因此FutureTask类中会重写Runnable接口的run()方法,而此run()方法调有调用了其中的call方法:
* try {
Callable<V> c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
if (ran)
set(result);
}
* 3. NumThread numThread = new NumThread();
* 由于我们定义的类实现了Callable接口,重写了Callable接口的call()方法,
* 在FutureTask类中也设置了一个Callable对象的属性,创建了一个接受Callable对象的构造器,会调用其call()方法
* 因此,我们此时定义的call()方法便被执行了,如果调用FutureTask的get()方法,那么就会得到call方法返回的result结果
* */
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class NumThread implements Callable{
@Override
// 将线程要执行的操作生命在call()方法中
public Object call() throws Exception {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0){
sum += i;
System.out.println(i);
}
}
return sum;
}
}
public class ThreadNew {
public static void main(String[] args) {
// 创建实现类的对象
NumThread numThread = new NumThread();
// 创建FutureTask类的对象
FutureTask futureTask = new FutureTask(numThread);
// 创建Thread对象
Thread t1 = new Thread(futureTask);
t1.start();
try {
Object sum = futureTask.get();
System.out.println(sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
不到之处,请批评指正,谢谢。