本文共 2380 字,大约阅读时间需要 7 分钟。
总结:线程执行start()
的时候,会先执行自己的run()
方法,只有当自己的run()
为空的时候,才会去执行父类的runnable
先看一道题:以下多线程执行的结果是什么?
new Thread( new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("1"); } } } ) { @Override public void run() { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2"); } } }.start();
看这个之前,我们先看一下java中,Thread
是怎么实现run
方法的。
target(Runnable)
不为空的时候,run
方法才会被执行。 Thread 实现Runnable接口
Thread 重写run方法
我们把上面代码精简一下,可以得到如下代码:
new Thread(runnable.run()){ run() }.start();
首先 Thread
执行start()
的时候,会先去执行自己的run()
方法,只有当自己的run()
为空的时候,才会去执行父类的runnable
,因此上文被执行的是System.out.println("2");
父类此时被子类覆盖了。
new Thread(runnable.run()){ //只有当自己的run()为空的时候才会被执行 run() //第一个被执行 }.start();
①
//Thread的子类 Thread thread = new Thread() { @Override public void run() { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }; thread.start();
②
//第二个线程 实现Runnable Thread thread2 = new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }); thread2.start();
注意:
以上为Demo,只演示代码,但是会造成死循环。转自
转载地址:http://xoazi.baihongyu.com/