Runnablerun() 方法没有返回值,也不能抛出受检异常。Callable 是对 Runnable 的增强,解决了这两个问题。

Callable 不能直接被 Thread 类使用,通常需要和 ExecutorService(线程池)或 FutureTask 配合。

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreeTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyCallable myCallable = new MyCallable();
        // 使用FutureTask包装Callable
        FutureTask<String> futureTask = new FutureTask<>(myCallable);
        // FutureTask也实现了Runnable接口,所以可以传给Thread
        Thread thread = new Thread(futureTask, "children");
        thread.start();
        // 获取线程执行结果
        // get()方法会阻塞当前线程,直到call()方法执行完毕返回结果
        System.out.println("任务开始执行");
        String result = futureTask.get();
        System.out.println("子线程执行完毕,结果是: " + result);

        System.out.println("主线程结束...");
    }
}

/**
 * 实现Callable接口和实现Runnable接口的区别:
 * 1. Callable接口有返回值,Runnable接口没有返回值
 * 2. Callable接口抛出异常,Runnable接口不能抛出异常
 */
class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(2000); // 模拟耗时计算
        return Thread.currentThread().getName() + "线程执行成功了";
    }
}

标签: java

添加新评论