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()方法体