聊聊线程之run方法

话不多说

参考书籍 汪文君

什么是线程?

1.现在几乎百分之百的操作系统都支持多任务的执行,对计算机来说每一个人物就是一个进程(Process),在每一个进程内部至少要有一个线程实在运行中,有时线程也称为轻量级的进程。

2.线程是程序执行的一个路径,每一个线程都有自己的局部变量表、程序计数器、操作栈以及各自的生命周期(这部分可以参考周志明的深入了解jvm,每个线程都有自己的私有栈内存,其中包括虚拟机栈,本地方法区,程序计数器),现代操作系统中一般不止一个线程在运行,当启动了一个java虚拟机(jvm)时,从操作系统开始就会创建一个新的进程(jvm进程),JVM进程中将会派生或者创建很多线程。

怎么创建线程那?

这里要声明一下创建线程只有一种方式:构造Thread类

实现线程的执行单元有两种方式:1.重写Thread的方法 2.实现Runnable接口的run方法,并且讲Runnable实例用作构造Thread的参数。

我们开始实现执行单元

Thread t=new Thread(){

      @override

       public void run(){

         System.out.println("我是一个线程")

      }

};

t.start()或者调用t.run(),运行结果:我是一个线程   

问题来了那为什么调用start()和run()一样那?  这里看段线程start()源码

 start0()是什么方法那?是不是有点神秘,它跟run()方法有什么关系那? 简单的解释下:start0()是个JNI方法,他的作用就是回调本地方法,回归正传,在执行start()方法时,会调用start0()方法,然后虚拟机会回调本地重写的run()(run()方法是被JNI方法start0()调用的)有人问为什么为调用重写的方法哪?每个类都有自己的一个虚表,当每个方法被重写时此时也就是重写的方法会覆盖原有的方法,所以调用时会调用重写的方法,其实底层比这更复杂,想要更深入的可以看看虚拟机

线程注意事项:

  Thread被构造后的NEW状态,事实上threadStatus这个内部属性为-0

不能两次启动Thread,否则就会出现IllegalThreadStateException异常

线程启动后将会被放入一个T和read Group中,每个线程不是暴露在外的,都有一个线程组

一个线程生命周期结束,也就是到了TERMINATED状态(消亡)。再次调用start方法是不允许的,也就是说TERMINATED状态是没有办法会发哦RUNNABLE/RUNNING状态的

那Runnable怎么实现和调用run方法的那,下面我们慢慢来揭秘

第一步  实现执行单元      Thread t=new Thread(()->System.out.println("我是一个执行单元"));

t.start()和t.run()此时还是可以调用这有事为什么那? 难道和上边那个原理一样?答案:否 ,不然我也不会在这闲扯  

第二步揭秘  

不多说看源码 

t.start()会调用本地方法run()但是这个run是谁的run那?是Thread的还是Runnable的那,这里是Thread的run()方法,因为Thread自己本身就有个实现的run方法,虚表中存的也是Thread的run方法

疑问又来了,为什么调用的是Thread的run()执行的确是Runnable的run()那?  重点在target这个是什么对象 

原来如此target就是我们传进去的Runnable  ,那好我们再看Threadd的run()方法

Thread的run()方法调用Runnable的run(),所以执行的是Runnable的方法。

这两种实现还有一些注意:重写Thread类的run方法和实现Runnable接口的run方法还有一个很重要的不同,那就是Thread类的run方法是不能共享的,也就是说A线程不能把B线程的run方法当作自己的执行单元,而使用Runnable接口则很容易就能实现这一点,使用同一个Runnable的实例构造不同的Thread实例

后续更新线程的更多相关内容,线程的学习路上一起相伴

猜你喜欢

转载自blog.csdn.net/sunboylife/article/details/83832122