JavaSE8基礎 多線程 匿名內部類既重寫Thread中run,又實現Runnable中run
阿新 • • 發佈:2017-10-09
run compile 去掉 思考 release mpi window generate fix
禮悟:
好好學習多思考,尊師重道存感恩。葉見尋根三返一,活水清源藏於零。
虛懷若谷良心主,皓月當空自在王。願給最苦行無悔,誠勸且行且珍惜。
os :windows7 x64
jdk:jdk-8u131-windows-x64
ide:Eclipse Oxygen Release (4.7.0)
測試類:
package blog.jizuiku6; /** * 匿名內部類 既 繼承了Thread類,重寫了其中的run()方法 * 又 實現了Runnable接口,實現了其中的run()方法 * * @author jizuiku * @version V17.09.27 */ public class FixedETIRDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5550; i++) { System.out.println("博客園" + i); } } }) { @Override public void run() { // TODO Auto-generated method stub super.run(); for (int i = 0; i < 5000; i++) { System.out.println("____給最苦" + i); } } }.start(); // 實驗的結果是 兩個run方法都執行了! // 這個和視頻教程中演示的不一樣,視頻中只執行了子類中run() // 而且好像兩個run()方法的執行還是有順序的 // 視頻中是jdk7 , 給最苦 用的是jdk8,和這個有關系嗎? // 這個現象不懂,給最苦 求教... } }
結果:
針對這個結果,給最苦產生疑問了,難道結果輸出的順序是巧合,還是必然?其中蘊含著怎樣深刻的哲理,這回沒有老師帶領,只能自己運用所學進行分析!
下面是 給最苦 的探索與分析過程,
先用反編譯看看,打開bin文件夾的指定包,給最苦 看到了三個.class文件,有趣!用Xjad反編譯後得到如下的三個源代碼文件
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; public class FixedETIRDemo { public FixedETIRDemo() { } public static void main(String args[]) { (new Thread(new Runnable() { public void run() { for (int i = 0; i < 5550; i++) System.out.println((new StringBuilder("博客園")).append(i).toString()); } }) { public void run() { super.run(); for (int i = 0; i < 5000; i++) System.out.println((new StringBuilder("____給最苦")).append(i).toString()); } }).start(); } }
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; // Referenced classes of package blog.jizuiku6: // FixedETIRDemo class FixedETIRDemo$2 extends Thread { public void run() { super.run(); for (int i = 0; i < 5000; i++) System.out.println((new StringBuilder("____給最苦")).append(i).toString()); } FixedETIRDemo$2(Runnable $anonymous0) { super($anonymous0); } }
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://kpdus.tripod.com/jad.html // Decompiler options: packimports(3) fieldsfirst ansi space // Source File Name: FixedETIRDemo.java package blog.jizuiku6; import java.io.PrintStream; // Referenced classes of package blog.jizuiku6: // FixedETIRDemo class FixedETIRDemo$1 implements Runnable { public void run() { for (int i = 0; i < 5550; i++) System.out.println((new StringBuilder("博客園")).append(i).toString()); } FixedETIRDemo$1() { } }
看到這三個源代碼,是不是每個匿名內部類都會被編譯成一個單獨的類呢?可是即使明白了這個特點,也不能解釋輸出的異常結果。當 給最苦 冥思苦想的時候,突然靈光一閃,用Debug看看!於是,開始Debug。
step_0
step_1
step_2
step_3
step_4
step_5
step_6
step_7
step_8
step_9
原來異常結果的根源就在 super.run()上!那麽 我去掉這句話,是不是一切如同視頻中講的那樣,只會運行子類中run()方法
代碼:
package blog.jizuiku6; /** * 匿名內部類 既 繼承了Thread類,重寫了其中的run()方法 * 又 實現了Runnable接口,實現了其中的run()方法 * * @author jizuiku * @version V17.09.27 */ public class FixedETIRDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int i = 0; i < 5550; i++) { System.out.println("博客園" + i); } } }) { @Override public void run() { // TODO Auto-generated method stub // super.run(); for (int i = 0; i < 5000; i++) { System.out.println("____給最苦" + i); } } }.start(); // 當 給最苦 去掉super.run()的時候,發現跟視頻教程中的效果一樣了 // 當 給最苦 再次 超級仔細的觀看 視頻教程中的代碼時發現:視頻中沒有寫super.run() // 經過這一番折騰,學到很多... // 在編寫代碼中,每一行代碼都是有生命的,有意義的,都要珍惜、認真對待 } }
結果:
問題分析完成了,雲淡了 風輕了。。。
Java優秀,值得學習。
學習資源:API手冊 + Java源碼 + Xjad + 清凈的心地。
JavaSE8基礎 多線程 匿名內部類既重寫Thread中run,又實現Runnable中run