Runnable和Callable

本文详细介绍了Java中创建多线程的两种主要方式:实现Runnable接口和继承Thread类。通过实例解析了Runnable接口的实现步骤,强调了Thread类内部如何调用Runnable的run()方法。同时,对Callable接口进行了讲解,说明了其call()方法能返回值和处理异常的特点,以及创建Callable线程的流程。此外,还简单比较了Runnable和Callable的差异和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Runnable:接口,定义了抽象方法run()。

实现Runnable接口创建多线程的步骤:(最本质创建线程方法)

1)自定义类实现Runnable接口,在类中实现run()方法

2)创建自定义类的对象。

3)创建线程Thread对象,并把自定义类对象作为构造器参数闯入。

4)通过线程Thread对象调用start()方法,启动线程,运次run()方法。

说明:

1)如果通过自定义类继承Thread方式实现多线程,自定义类重写run(),然后创建自定义类对象调用start(),进而调用了run()。

2)Thread类本身实现了Runnable接口,Thread类自然实现了抽象方法run(),如下:

@Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

target是Runnable接口实现类的对象:
public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

3)Thread类是实现了Runnable接口的,而我们自定义类实现了Runnable接口和其抽象方法run(),创建了自定义类对象后还把其作为Thread构造器参数传入,就是因为上面的Thread方法。

    

Callable:接口,定义抽象方法call(),此方法有返回值,异常机制。

实现Callable接口创建多线程的步骤;

1)创建一个实现callable接口的实现类,在此实现类中实现call(),把线程需要执行的操作声明在其中。

2)创建上面实现类对象,并把此对象作为FutureTask类构造器参数,创建FutureTask类对象

3)创建Thread类对象,把FutureTask对象作为构造器参数传入,然后调用start()

说明:

1)Runnable和Callable是同一级别,两者都有各自抽象函数:run()和call(),后者函数更强大,因为有返回值、可以抛出异常和支持泛型。

2)FutureTask实现了RunnableFuture接口;RunnableFuture接口继承Runnable接口。代码如下:

public class FutureTask<V> implements RunnableFuture<V>

public interface RunnableFuture<V> extends Runnable, Future<V> 

FutureTask间接实现了Runnable接口。

3)待续。。

 

创建多线程的第三种方法:继承Thread类:

1)创建类继承thread类,并具体实现run()方法

2)创建上面类的对象,通过对象调用start():开启新线程,执行run()方法体

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值