Java多线程-38-实现runnable的原理和两种多线程的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/82120417

前面两篇介绍了两种多线程的实现过程,第一种是通过继承Thread类来调用start()方法,第二种是实现Runnable接口并重写了run方法,然后给Thread有参构造传递一个runnable的引用来实现。这篇,我们先来看看第二种方式的实现原理,然后分析和对比两种多线程实现的区别和优缺点。

1.实现runnable的原理

看下面代码,然后ctrl+点击鼠标查看Thread的有参构造,跟着target的传递,一步一个点击init方法。

public static void main(String[] args) {
	MyRunnable mr = new MyRunnable();	//4.创建Runnable子类对象
	//Runnable target = mr;
	Thread t = new Thread(mr);		//5.将其当做参数传递给Thread构造函数
	t.start();			//6.开启线程
		
	}

1) 看Thread类的构造函数,传递了Runnable接口的一个引用,上面是mr
2)通过init()方法找到传递的target赋值给了成员变量target
3)查看run方法,发现run方法中有判断,如果target不为null就会调用Runnable接口子类对象的run方法,也就是代码中mr.run(),也就是上一篇代码中MyRunnable类下的run方法。(这里涉及多态,编译看父类,运行看子类)

2.两种多线程实现方式区别
查看源码的区别:
1)继承Thread:由于子类重写了Thread类的run()方法,当调用start()时候,直接找子类的run()方法(这个过程JVM帮我们做)
2)实现Runnable:构造函数传入了Runnable的引用,成员变量记住了它,start()调用run()方法时,内部判断成员变量Runnable的引用是否为空,不为空编译时看的是Runnable的run()方法,运行时候执行的是子类run()方法

继承Thread:
优点:可以直接使用Thread类中的方法,代码简单
缺点:如果已经有了父类,就不能使用Thread继承,因为Java是单继承

实现Runnable接口:
优点:即使自己定义的线程类有了父类也没有关系,因为有了父类也可以实现Runnable接口,而且接口是可以多实现的
缺点:不能直接使用Thread中的方法,需要先获取到线程对象后,才能得到Thread的方法,代码相对复杂一些。

总结:如果没有存在父类,建议优先选择继承Thread实现多线程,如果有父类,再去实现Runnable接口方式实现多线程。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/82120417