我的多线程专栏的博客写了常见的创建线程的两种方式,继承Thread类或者实现Runnable接口
这里再写一下第三种方式实现Callable接口。这里我们用FutureTask类来承载实现Callable接口的线程类。
FutureTask类继承RunnableFuture接口,RunnableFuture又继承Runnable和Future接口。
废话不多说,开干。
先我们实现自己需要的实现Callable接口的类:
import java.util.concurrent.Callable;
public class MyThread implements Callable {
@Override
public String call() throws Exception {
System.out.println("已经创建完毕一个自己的线程");
return "MyThread created...";
}
}
然后用FutureTask类进行测试:
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CreateCallableThread {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask ft = new FutureTask<>(new MyThread());
Thread t = new Thread(ft);
t.start();
System.out.println(ft.get());
Thread.sleep(5000);
System.out.println("这是主线程");
}
}
输出结果如下:
已经创建完毕一个自己的线程
MyThread created...
这是主线程
上面输出的结果中,MyThread created 是立即得到的。其实是因为执行时间段,正常情况下get()f方法获取结果是阻塞等待的。
“这是主线程”这句话也是等待了5秒之后才打印出来。