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