1. 程式人生 > >JavaSE8基礎 多線程 匿名內部類既重寫Thread中run,又實現Runnable中run

JavaSE8基礎 多線程 匿名內部類既重寫Thread中run,又實現Runnable中run

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