Thinking in java读书笔记-线程(一)

《Thinking in java》第四版666页有一个示例如下:

package thread;

import java.lang.Runnable;
public class SelfManaged implements Runnable{
    private int countDown = 5;
    private Thread t = new Thread(this);
    public SelfManaged(){
        t.start();
    }

    public String toString(){
        return Thread.currentThread().getName() + "(" + countDown + "),";
    }

    public void run(){
        while(true){
            System.out.print(this);
            if(--countDown == 0){
                return;
            }
        }
    }

    public static void main(String args[]){
        for(int i = 0; i < 5; i++){
            new SelfManaged();
        }
    }
}

当然,这段代码从功能上来看很好理解,其实就是主线程里面开启了5个新线程。

然而我觉得真实有迷惑性的地方在这里:

private Thread t = new Thread(this);
    public SelfManaged(){
        t.start();
    }

按照一般的解释, this是指向当前对象的一个句柄(preference)。但是既然如此,那么为什么在对象还没有创建时,this就可以作为Thread()构造函数的参数给传递过去呢?
这里应该是与JVM相关的内容,于是查阅了很多资料,将研究结果记录如下:

  1. 反编译代码
    将SelfManaged.class文件反编译可得到如下代码:

对应于SelfManaged()构造器的部分:(//汉字 是我加的注释)

// Method descriptor #12 ()V
// Stack: 4, Locals: 1
public SelfManaged();
0 aload_0 [this] //将局部变量区slot 0处的变量this载入栈
1 invokespecial java.lang.Object() [14] //invokespecial指令的作用是以栈顶的reference类型的数据(此处为this)为方法接收者,调用此对象的示例构造器方法、private方法或者它父类的方法。后面的[14]指代的是具体调用哪个方法。
4 aload_0 [this] //将slot 0的变量this入栈
5 iconst_5 //常量5入栈
6 putfield thread.SelfManaged.countDown : int [16] //取操作数栈顶的值存入countDown中
9 aload_0 [this] //将slot 0的变量this入栈
10 new java.lang.Thread [18] //以栈顶数据(此处为this)为接收者,new一个Thread实例
13 dup
14 aload_0 [this]
15 invokespecial java.lang.Thread(java.lang.Runnable) [20]
18 putfield thread.SelfManaged.t : java.lang.Thread [23]
21 aload_0 [this]
22 getfield thread.SelfManaged.t : java.lang.Thread [23]
25 invokevirtual java.lang.Thread.start() : void [25]
28 return

从以上的字节码可以看出,对象的初始化是在构造器里面进行的(从 countDown = 5 赋值可以看出来)。也就是说this虽然是代表当前对象的一个reference,但是没有必要简单的地认为在定义示例变量的时候就不可以用this参数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Thinking in Java》是一本经典的Java编程入门教材,通过阅读该书可以系统地学习Java编程的基础知识和高级概念。阅读过程中,我结合自己的学习体验和实践,进行了详细的学习笔记。 首先,该书从基础语法开始介绍,包括数据类型、控制语句、数组等。对于初学者来说,这些基础知识是最基本的,通过书中的示例代码和解析,我能够更好地理解这些概念和语法规则。 其次,书中对面向对象编程进行了深入的讲解。通过学习面向对象的思想,我明白了类、对象、继承、多态等概念的含义和使用方法。同时,书中还讲解了接口、内部类、异常处理等较为高级的概念,极大地拓宽了我的Java知识面。 另外,该书还介绍了Java的常见类库和工具,如字符串操作、集合框架、输入输出、线程等。这些内容对于实际开发非常有用,而且书中的示例代码也能帮助我更好地理解和应用这些类库和工具。 此外,该书通过大量的实例和案例,生动地展示了Java编程的实战应用。这些实例涵盖了各种不同的应用场景,从简单的程序到复杂的项目,都有所涉及。通过分析这些实例,我不仅可以学习到实际编程的技巧,还能提高自己的解决问题的能力。 总的来说,读完《Thinking in Java》后,我对Java编程有了更深入的理解和掌握。通过学习笔记的整理,我不仅复习了各个知识点,还加深了对这些概念的理解。希望这份学习笔记能够帮助到其他想要学习Java的同学,让他们能够更快地入门和掌握这门编程语言。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值