Java多线程之Thread的run()与start()方法解析
2017-03-03 17:38
691 查看
持续更新
当我们使用Thread类来创建线程后,总是通过调用实例方法start()来启动线程,而线程在启动后一旦被线程调度器调度便会执行run()方法。那么问题来了,如果直接使用Thread实例调用run()方法,此时的执行线程会是谁呢?(主线程main or 子线程)。不妨来测试一番:
执行结果:
Ok,现在来解释为什么直接调用run()方法时,执行线程是main:
实例mt是一个Thread实例没错,但是只有当执行mt.start()后,JVM会启动一个与之相对应的线程。换句话说,mt只有在调用了start()方法后,才会被当作线程对象处理。如果直接调用run()方法,系统会把线程对象mt当作普通对象处理,run()方法就是一个普通方法。因此,要正确获取调用run()方法的线程名不能直接调用实例方法getName(),而应使用类方法获取线程后在获取线程名。
思考:通过实现Runnable接口的类,其实例直接调用run()方法与作为Thread的target参数的Thread实例调用run()方法会怎样?
此处给出代码:
结果如图:
至于原因,我想不用说也能想清楚了吧!
当我们使用Thread类来创建线程后,总是通过调用实例方法start()来启动线程,而线程在启动后一旦被线程调度器调度便会执行run()方法。那么问题来了,如果直接使用Thread实例调用run()方法,此时的执行线程会是谁呢?(主线程main or 子线程)。不妨来测试一番:
public class Test{ public static void main(String[] args) { MyThread mt = new MyThread(); mt.run(); mt.start(); } } class MyThread extends Thread { @Override public void run() { //此处不直接调用实例方法getName()来获取线程名,原因请看下文 System.out.println("Current thread --- " + Thread.currentThread().getName()); } }
执行结果:
Ok,现在来解释为什么直接调用run()方法时,执行线程是main:
实例mt是一个Thread实例没错,但是只有当执行mt.start()后,JVM会启动一个与之相对应的线程。换句话说,mt只有在调用了start()方法后,才会被当作线程对象处理。如果直接调用run()方法,系统会把线程对象mt当作普通对象处理,run()方法就是一个普通方法。因此,要正确获取调用run()方法的线程名不能直接调用实例方法getName(),而应使用类方法获取线程后在获取线程名。
思考:通过实现Runnable接口的类,其实例直接调用run()方法与作为Thread的target参数的Thread实例调用run()方法会怎样?
此处给出代码:
public class Test{ public static void main(String[] args) { MyRun mr = new MyRun(); Thread t = new Thread(mr); mr.run(); t.run(); t.start(); } } class MyRun implements Runnable { @Override public void run() { System.out.println("Thread name in run : " + Thread.currentThread().getName()); } }
结果如图:
至于原因,我想不用说也能想清楚了吧!
相关文章推荐
- java线程之start方法与run方法解析以及currentThread与this解析
- java再复习——多线程之初识线程,并从源码角度分析start与run方法,Thread类与Runnable接口
- Java Thread中start和run方法的区别?
- java中Thread类中的start()方法与run()方法
- java 中两种多线程的区别,start方法和run方法的启动区别
- java.lang.IllegalThreadStateException异常原因解析——同一个线程不能重复调用start方法
- java实现多线程的方式以及run方法和start方法的区别
- java中Thread类中的start()方法与run()方法
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别 (r)
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口
- java线程的start和run方法解析
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- java中Thread类中的start()方法与run()方法
- java thread start()和run()方法简析
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
- Thread.java start方法和run方法的区别
- 黑马程序员 Java学习总结之多线程中start方法和run方法的区别(这个一定要搞清楚)
- Java线程中start和run方法全面解析
- JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口