码迷,mamicode.com
首页 > 编程语言 > 详细

JavaSE8基础 多线程 匿名内部类既重写Thread中run,又实现Runnable中run

时间:2017-10-08 22:31:34      阅读:341      评论:0      收藏:0      [点我收藏+]

标签:UI   clip   哲理   资源   anon   ack   源码   方法   java源码   

礼悟:
           好好学习多思考,尊师重道存感恩。叶见寻根三返一,活水清源藏于零。
           虚怀若谷良心主,皓月当空自在王。愿给最苦行无悔,诚劝且行且珍惜。




    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

标签:UI   clip   哲理   资源   anon   ack   源码   方法   java源码   

原文地址:http://www.cnblogs.com/jizuiku/p/7638606.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!