多线程学习笔记(1)

来源:互联网 发布:淘宝店铺店招怎么设置 编辑:程序博客网 时间:2024/04/20 06:06

多线程大家熟悉又陌生,开头我先说几句,现在越来越多的公司面试都会问多线程的问题,多线程作为基础,特别是毕业生,都是跳过了这个知识点,为了寻找工作都纷纷直接学习框架,死背面试题,但是这也是正常,学东西不就是为了先有份工作嘛,但是进入行业久了,特别是有些专注于业务的外包公司,对于员工的培养十分不重视,没有平时的技术交流,只是一味的让你写业务,假如业余时间不自己去汲取点新知识,混个个几年下来,有的只是业务知识,只能倚老卖老,很可能将来会被这行业淘汰,然而,社会上许多程序员都是如此,所以这行业淘汰很快,想要在这行扎根,就必须不断学习不断进取。

首先线程的创建有如下两种

(一)通过重写Thread里面的run方法
Thread thread = new Thread(){@Overridepublic void run() {}};
(二)通过重写runnable的run方法

Thread thread =new Thread(new Runnable() {@Overridepublic void run() {}});

下面我们来具体分析一下

我们用通俗易懂的方式来说,首先,把你需要执行的代码块放入run方法中,其次调用thread.start() 就能启动对应的线程了,是不是很简单。

写到这里其实我和大家一样有疑惑,这两种方式有什么区别,看了视频还有查阅资料发现,runnable这类更适合面向对象的思想,另外采用runnable的话多个线程可以共享同一个线程类(实际应该是线程的target类)的实例属性。而thread的run则不能共享的效果。


额外Thread源码资料:

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

为什么要重写run方法现在应该一目了然了,因为假如Runnable里面没东西那么什么都不运行。

private Runnable target;
public Thread(Runnable target) {    init(null, target, "Thread-" + nextThreadNum(), 0);}

这里我们主要看一下init方法的第二个参数,传入的就是runnable对象,即是把线程类的引用保存到target中,这样target就不为空了,可以正常执行target的run方法了,或者也可以写runnable的run这样也可以执行线程了。

通俗的讲一个是写thread层,一个是写runnable一层,runnable一层为的就是让thread的target不为null这样就可以执行thread层run方法,而直接写thread层的话,会把原本执行的target.run()给覆盖掉,这样也就不存在需要runnable了因为target.run()没了,不会调用,反过来说,假如你两层都写了run(),那么跑的必定是thread的run()(前提排除你自己调用target.run()或者自己再去实现runnable这种情况),因为thread你重写了run(),不调用target.run(),,所以在同时存在的情况下是不会走runnable的代码块的,反过来说,只写了runnable,那么走的就是runnable,因为thread的run方法还是target.run(),会走init方法.






原创粉丝点击