打开网易新闻 查看精彩图片

多线程的实现方式(三)

实现Callable接口( java.util.concurrent.FutureTask; /JUC包下的,属于java的并发包,老JDK中没有这个包。新特性。)

1、自定义一个MyCallable类来实现Callable接口

2、在MyCallable类中重写call()方法

3、创建FutureTask,Thread对象,并把MyCallable对象作为FutureTask类构造方法的参数传递进去,把FutureTask对象传递给Thread对象。

4、启动线程

这种方式的优点:可以获取到线程的执行结果。

这种方式的缺点:效率比较低,在获取t线程执行结果的时候,当前线程受阻塞,效率较低。

public class MyCallable2 {

public static void main(String[] args) throws Exception {

//第一步:创建一个“未来任务类”对象。

//参数非常重要,需要给一个Callable接口实现类对象。

FutureTask task = new FutureTask(new Callable() {

@Override

public Object call() throws Exception { // call()方法就相当于run方法。只不过这个有返回值

//线程执行一个任务,执行之后可能会有一个执行结果

//模拟执行

System.out.println("call method begin");

Thread.sleep(1000 * 10);

System.out.println("call method end!");

int a = 100;

int b = 200;

return a + b; //自动装箱(300结果变成Integer)

//创建线程对象

Thread t = new Thread(task);

//启动线程

t.start();

//这里是main方法,这是在主线程中。

//在主线程中,怎么获取t线程的返回结果?

// get()方法的执行会导致“当前线程阻塞”

Object obj = task.get();

System.out.println("线程执行结果:" + obj);

// main方法这里的程序要想执行必须等待get()方法的结束

//而get()方法可能需要很久。因为get()方法是为了拿另一个线程的执行结果

//另一个线程执行是需要时间的。

System.out.println("hello world!");