目录
1.实现多线程的方法
实现Runnable接口
继承Thread类
线程池创建线程
有返回值的Callable创建线程
其他创建方式,定时器Timer,匿名内部类
2.实现线程有几种方式
我们暂且先认为创建线程有两种方式,一种是实现Runnable接口创建,另一种是继承Thread类创建,其他的方式本质上都是在 new Thread() 外做了一层封装,不能被当作一种新的创建方式,接下来我们看下这两种创建线程方式又什么不一样的地方,首先我们看下这两种创建线程的方式
public class RealizeThread {
public static void main(String[] args) {
//实现Runnable接口创建线程
new Thread(new ExtendsThreadRunnable()).start();
//继承Thread类创建线程
new ExtendsThreadThread().start();
}
}
/**
* 实现Runnable接口创建线程
*/
class ExtendsThreadRunnable implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口");
}
}
/**
* 继承Thread类创建线程
*/
class ExtendsThreadThread extends Thread{
@Override
public void run() {
System.out.println("继承Thread类创建线程");
}
}
可以看到在继承 Thread 类创建线程时,我们通过 Thread 类的 start 方法启动了这个线程,而通过实现 Runnable 接口创建线程的时候则是 new 一个 Runnable接口的实现类, 在这个具体实现类外封装了一层Thread类,然后再通过Thread类的start方法启动线程,由此我们可以看到,这两种方法本质上都是通过实现Thread类来创建了一个线程,所以说我们可以得到以下结论:
本质上,实现线程只有一种方式,而要想实现线程执行的内容,却有两种方式,也就是通过 实现 Runnable 接口的方式,或是继承 Thread 类重写 run() 方法的方式
3.两种创建线程的优略性
1. 从代码架构考虑,Runnable 里只有一个 run() 方法,它定义了需要执行的内容,实现了 Runnable 与 Thread 类的解耦,Thread类负责线程启动和属性设置等内容,权责分明。
2. 使用 Thread 类方式,每次执行一次任务,都需要新建一个独立的线程,执行完任务后线程走到生命周期尽头被销毁,如果还想继续执行则需要新建一个继承了 Thread 类的类,如果在线程内执行的内容少的话,相对于创建这个线程的开销有些得不偿失,如果我们通过 Runnable 接口创建线程,可以直接把任务传入线程池,使用固定的一些线程来执行任务,无需频繁的创建与销毁线程,大大降低性能开销。
3. java语言不支持多继承,所以通过继承Thread类的方式创建多线程可能会影响到以后的代码拓展。
总结:创建多线程时,优先选择通过实现Runnable接口的方式来创建线程。