java中实现多线程有几种方法(java中实现多线程的两种方法)
导语:Java中实现多线程的几种方式——必备的多线程编程技能
一、继承Thread类
图1 Thread类部分源码
实现方式很简单,只需要创建一个类继承Thread类,然后重写run()方法。直接实例化新创建类的实例,调用其start()方法即可实现多线程并发,如果需要访问当前线程,直接使用this即可获取当前线程。该方式的缺点:由于Java是单继承的,所以这种方式实现的类不能再继承其它父类了。代码如下:
图2 Thread继承方式实现多线程
当然,这里的结果不代表线程的执行顺序,线程是并发执行的,如果多运行几次,打印顺序可能会不一样。多线程的运行过程中,CPU是以不确定的方式去执行线程的,故运行结果与代码的执行顺序或者调用顺序无关,运行结果也可能不一样这里还有一个需要注意的点就是main方法中应该调用的是myThread的start方法,而不是run()方法。调用start()方法是告诉CPU此线程已经准备就绪可以执行,进而系统有时间就会来执行其run()方法。而直接调用run()方法,则不是异步执行,而是等同于调用函数般按顺序同步执行,这就失去了多线程的意义了。
二、实现Runnable接口
图3 Runnable源码
该方式直接实现Runnable接口,方法主体无返回值,然后通过Thread类实例化进行调用,把实现Runnable接口的类包装成线程执行体,然后通过调用start()方法告诉系统线程准备就绪,可以安排执行了。如果想获取当前线程,可以通过Thread.currentThread()方法获得。代码如下:
图4 实现Runnable接口实现多线程
三、实现Callable接口实现
图5 Callable源码
该方式直接实现Callable接口,该方式相对于前两种方式,有两个优点:有返回值和可以抛出异常。上面的Runnable接口实现类实例是作为Thread类的构造函数的参数传入的,之后通过Thread的start执行run方法中的内容。但是Callable并不是Runnable的子接口,是个全新的接口,它的实例不能直接传入给Thread构造,所以需要另一个接口来转换一下。提供了Future接口来代表Callable接口里call()方法的返回值,并为Future接口提供了一个实现类FutureTask,该实现类的继承关系如图所示:
图6 FutureTask类继承关系即构造函数
所以这里面其实就是要比上一个方法再多一个转换过程,最终一样是通过Thread的start来创建新线程。有了这个思路,代码就很容易理解了:
代码示例:
图7 代码示例
运行结果:
图8 运行结果
本文内容由小迪整理编辑!