3.创建线程的第三个方式

本文探讨了Java中创建线程的两种常见方式:实现Runnable接口和继承Thread类,指出了这两种方式的局限性,即run()方法无返回值且无法抛出异常。然后介绍了JDK1.5以后引入的Callable接口,它允许有返回值和抛出异常,提高了线程处理的灵活性。通过实例展示了如何实现Callable接口,并使用FutureTask和Thread来启动和获取线程结果。
摘要由CSDN通过智能技术生成

Thread类和实现Runnable接口的线程类是没有返回值的,都是重写它们的run()方法,对比这两个创建线程的方式发现,这个run()方法有不足:

1.没有返回值

2.不能抛出异常

基于上面的两个不足,在JDK1.5以后出现了第三种创建线程的方式:实现Callable接口:

实现Callable接口的好处:1.有返回值 2.能抛出异常

缺点:线程创建比较麻烦

public class MyThread implements Callable<Integer> {
    /**
     * 创建第三种线程方式
     *
     * 实现Callable接口并重写call()方法
     * 1.可不带泛型,如果不带泛型,那么call方法的返回值类型就是Object类型
     * 2.带泛型,那么call方法返回值类型对应的类型
     * 3.从call方法看到,方法有返回值,可以抛出异常
     */
    @Override
    public Integer call() throws Exception {
        return new Random().nextInt(10);//返回10以内的随机数
    }
}

测试类

public static void main(String[] args) throws ExecutionException, InterruptedException {
        //定义一个线程对象
        MyThread mt = new MyThread();
        /*定义了线程后,得启动线程start(),故new Thread()启动线程
        *但new Thread()没有实现Callable接口
        * 通过底层源码知道,new Thread()可以接受Runnable接口的
        * 故通过FutureTask类接收Callable,FutureTask又是实现Runnable接口的
        * 再Thread接收FutureTask实现类
        * */

        FutureTask ft = new FutureTask(mt);
        Thread t = new Thread(ft);

        t.start();

        //获取线程得到的返回值:
        Object obj =ft.get();
        System.out.println(obj);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值