A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜佳瑞 中级黑马   /  2012-9-3 14:08  /  1774 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜佳瑞 于 2012-9-3 14:13 编辑

今天看书有一个很有意思的例题,其实说服自己理解的理由很简单,但是还是想叫大家来看一下,有没有更好的解释:
class SetNameThreadDemo extends Thread
{
        public void run()
        {
                for(int i=0;i<10;i++)
                {
                         printMsg();
                }
         }
        public void printMsg()
        {
                //  获得运行此代码的线程的引用
               Thread t = Thread.currentThread();
                    String name = t.getName();
                    System.out.println("name = "+name);
        }
}
class ThreadDemo9_3
{
        public static void main(String args[])
        {
                SetNameThreadDemo tt = new SetNameThreadDemo();
                         //  在这里设置线程的名称
                tt.setName("test thread");
                tt.start(); //开启线程,通过线程中的run()方法调用printMsg() 方法
                for(int i=0;i<10;i++)
                {
                        tt.printMsg(); //主函数中直接调用printMsg() 方法,虽然还是tt这个线程对象调用,但是不通过run()方法,打印出的名字是main。也许你会说在主线程里调用printMsg() 方法,当然打印主线程的名字,可是这里使用tt调用的呀,这应该怎么理解呢?
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

6 个回复

倒序浏览
  1. public void printMsg()
  2.         {
  3.                 //  获得运行此代码的线程的引用
  4.                Thread t = Thread.currentThread();
  5.                     String name = t.getName();
  6.                     System.out.println("name = "+name);
  7.         }
复制代码
其实我是这样理解的,tt.start(); 开启了一个线程,下边的for循环执行的却是主线程代码,tt.printMsg();仅仅是一个方法,在主线程中运行,这个里边有获得运行此代码的线程的引用,所以打印的当前主线程的名称。我是这样理解的。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
  1. public void printMsg()
  2.         {
  3.                 //  获得运行此代码的线程的引用
  4.                Thread t = Thread.currentThread();
  5.                     String name = t.getName();
  6.                     System.out.println("name = "+name);
  7.         }
复制代码
其实我是这样理解的,tt.start(); 开启了一个线程,下边的for循环执行的却是主线程代码,tt.printMsg();仅仅是一个方法,在主线程中运行,这个里边有获得运行此代码的线程的引用,所以打印的当前主线程的名称。我是这样理解的。
回复 使用道具 举报
整个过程应该是这样的:
    程序加载main函数,再生成线程任务对象SetNameThreadDemo并指向tt,接着设置对象的继承的成员属性setName(),接着tt.start()开启新线程与main线程开始抢资源运行,因为没有同步所以会出现一些安全问题(在printMsg这里只有一个sop name的语句,故看起来正常),与此同时main线程也执行后面的语句,执行tt.printMsg()方法是SetNameThreadDemo正常调用自己的成员方法,只不过执行线程是main,此时打印的线程名字也当然就是main了,再详细说就是我们打印的是线程名而非调用对象名字。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
整个过程应该是这样的:
    程序加载main函数,再生成线程任务对象SetNameThreadDemo并指向tt,接着设置对象的继承的成员属性setName(),接着tt.start()开启新线程与main线程开始抢资源运行,因为没有同步所以会出现一些安全问题(在printMsg这里只有一个sop name的语句,故看起来正常),与此同时main线程也执行后面的语句,执行tt.printMsg()方法是SetNameThreadDemo正常调用自己的成员方法,只不过执行线程是main,此时打印的线程名字也当然就是main了,再详细说就是我们打印的是线程名而非调用对象名字。
回复 使用道具 举报
   tt.printMsg(); //主函数中直接调用printMsg() 方法,虽然还是tt这个线程对象调用,但是不通过run()方法,打印出的名字是main。也许你会说在主线程里调用printMsg() 方法,当然打印主线程的名字,可是这里使用tt调用的呀,这应该怎么理解呢?
当java程序开始运行后,程序至少会创建一条主线程,主线程的线程执行体不是有run方法确定的,而是由main方法来确定:main方法的方法体代表主线程的线程执行体!
回复 使用道具 举报
张飞年 发表于 2012-9-3 15:39
整个过程应该是这样的:
    程序加载main函数,再生成线程任务对象SetNameThreadDemo并指向tt,接着设置对 ...

最后一句话很靠谱,应该就是这样理解了。
问题已解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马