实现多线程的第三种方式(实现Callable接口)

之前介绍了两种实现多线程的方式:继承Thread类和实现Runnable接口。但是这两种方式的线程都不能返回一个返回值,因为run()没有返回值。

但是有时候我们委派一个线程去执行一个任务,我们希望这个线程可以返回该任务的执行结果。

JDK8中推出了一种新的实现多线程的方式:实现Callable接口,该种方式可以获取线程的返回值。

例:

package com.dh.callable;

import java.util.concurrent.Callable;//Callable位于JUC并发包下
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Thread01 {
    public static void main(String[] args) {
        //创建一个“未来任务类”对象,参数为实现Callable的类
        FutureTask futureTask = new FutureTask(new MyThread());
        //将该对象做为参数创建一个线程
        Thread t = new Thread(futureTask);
        t.setName("t");
        t.start();
        //获取线程的返回值
        Object o = null;
        try {
            o = futureTask.get();//会阻塞,并且该方法可能要执行很久,因为要等待另外一个线程的执行结果
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(o);
        System.out.println(Thread.currentThread().getName());
    }

}

class MyThread implements Callable {

    //相当于run(),但是call()有返回值
    @Override
    public Object call() throws Exception {
        Thread.sleep(1000 * 10);
        return Thread.currentThread().getName();
    }
}

结果:

t
main

程序会先等待10s再输出t及main,并且t一定再main之前输出,因为get()会产生阻塞。

posted @ 2021-02-23 20:19  deng-hui  阅读(302)  评论(0编辑  收藏  举报