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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王晓新 中级黑马   /  2012-6-20 15:16  /  2366 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王晓新 于 2012-6-20 16:44 编辑

我想问一下,为什么我运行出来的结果中线程名为嘛是Thread-2开始的,0线程和1线程怎么不见了
  1. class ThreadInt extends Thread
  2. {
  3.         public synchronized void run()
  4.         {
  5.                 for(int i=0;i<10;i++)
  6.                         System.out.println(Thread.currentThread().getName()+" i="+i);
  7.         }
  8. }
  9. class ThreadString extends Thread
  10. {
  11.         public synchronized void run()
  12.         {
  13.                 for(int i='a';i<'a'+25;i++)
  14.                         System.out.println(Thread.currentThread().getName()+" "+(char)i);
  15.         }
  16. }
  17. class  ThreadTest
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 ThreadInt ti=new ThreadInt();
  22.                 ThreadString ts=new ThreadString();
  23.                 Thread t1=new Thread(ti);
  24.                 //Thread t2=new Thread(ti);
  25.                 //Thread t3=new Thread(ts);
  26.                 //Thread t4=new Thread(ts);
  27.                 t1.start();
  28.                 //t2.start();
  29.                 //t3.start();
  30.                 //t4.start();
  31.         }
  32. }
复制代码
就这样开启一个线程,线程名也是Thread-2,不知道什么原因

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 主线程的名字就是main没其他!

查看全部评分

17 个回复

倒序浏览
附图:  

QQ截图20120620152307.jpg (13.53 KB, 下载次数: 38)

QQ截图20120620152307.jpg
回复 使用道具 举报
那是跟你电脑的cpu有关,只有2线程抢到资源,0和1没有抢到资源,你把i的范围增大就可能解决以上问题
回复 使用道具 举报
代码没问题啊,呵呵呵

线程名是Thread-2是因为本身就是第二个线程而已..这个是系统起的名字啊......
ThreadString ts = new ThreadString();生成了第一个线程,但是没有跑
Thread t1 = new Thread(ti);生成了第二个线程,也没有跑.

可见,线程的名称是创建线程对象时分配的,而不是开始跑的时候呵呵呵
回复 使用道具 举报
因为你的程序现在总共就是三个线程啊、 main是一个吧;他是第一个执行的所以应该是Thread-0;ThreadString ts=new ThreadString();是一个,虽然没有开始运行;但他已经把Thread-1占了;也就是他已经在内存中存在只是还没有开始运行起来;你可以把t1.start()注释开启ts.start();验证一下;
回复 使用道具 举报
线程对象创建了就有名字了。
ThreadInt ti=new ThreadInt();//Thread-0
  ThreadString ts=new ThreadString();//Thread-1
  Thread t1=new Thread(ti);//Thread-2
回复 使用道具 举报
本帖最后由 唐辉辉 于 2012-6-20 15:40 编辑

class ThreadInt extends Thread
{
        public synchronized void run()
        {
                for(int i=0;i<10;i++)
                        System.out.println(Thread.currentThread().getName()+" i="+i);
        }
}
class ThreadString extends Thread
{
        public synchronized void run()
        {
                for(int i='a';i<'a'+25;i++)
                        System.out.println(Thread.currentThread().getName()+" "+(char)i);
        }
}
class  Demo1
{
        public static void main(String[] args)
        {
                ThreadInt ti=new ThreadInt();
                ThreadString ts=new ThreadString();

                //System.out.println(Thread.currentThread().getName()+" "+(char)i);

                //Thread t1=new Thread(ti);去除这几个,ThreadInt 和ThreadString 本身就继承了Thread类
                //Thread t2=new Thread(ti);
                //Thread t3=new Thread(ts);
                //Thread t4=new Thread(ts);
                ti.start();//这里要改成t1改成ti
                //t2.start();
                //t3.start();
                //t4.start();
        }
}


评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 恭喜啊~!!

查看全部评分

回复 使用道具 举报
本帖最后由 王明明 于 2012-6-20 15:43 编辑
  1. class ThreadInt extends Thread
  2. {
  3.         public synchronized void run()
  4.         {
  5.                 for(int i=0;i<10;i++)
  6.                         System.out.println(Thread.currentThread().getName()+" i="+i);
  7.         }
  8. }
  9. class ThreadString extends Thread
  10. {
  11.         public synchronized void run()
  12.         {
  13.                 for(int i='a';i<'a'+25;i++)
  14.                         System.out.println(Thread.currentThread().getName()+" "+(char)i);
  15.         }
  16. }
  17. class  tuziDemo
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 ThreadInt ti=new ThreadInt();
  22.                 ThreadString ts=new ThreadString();
  23.                 Thread t1=new Thread(ti);
  24.                 //Thread t2=new Thread(ti);
  25.                 //Thread t3=new Thread(ts);
  26.                 //Thread t4=new Thread(ts);
  27.                 t1.start();//你只开了一个线程吧?至于为什么一直是2线程 我刚注释了TS 对象 线程1就出现了 我想是因为是在预备着1线程给TS... 没有第一时间抢到执行权
  28.                 //ts.start();
  29.                 //t3.start();
  30.                 //t4.start();
  31.         }
  32. }
复制代码
回复 使用道具 举报
车风波 发表于 2012-6-20 15:31
线程对象创建了就有名字了。
ThreadInt ti=new ThreadInt();//Thread-0
  ThreadString ts=new ThreadStr ...

嗯,我试了一下,是这样的,但是并不是像邓杰同学说的,main是一个线程,但是这里的Thread-0其实是ThreadInt ti=new ThreadInt();我把其他语句都注释掉,main方法里面只有一条new ThreadInt().start(),结果就是Thread-0.
回复 使用道具 举报
class ThreadInt extends Thread

{

        public synchronized void run()

        {

                for(int i=0;i<10;i++)

                        System.out.println(Thread.currentThread().getName()+" i="+i);

        }

}

class ThreadString extends Thread

{

        public synchronized void run()

        {

                for(int i='a';i<'a'+25;i++)

                        System.out.println(Thread.currentThread().getName()+" "+(char)i);

        }

}

class  ThreadTest

{

        public static void main(String[] args) //它是首先开启的。是Thread-0;
        {

                ThreadInt ti=new ThreadInt();//它是第二开启的是Thread-1

                ThreadString ts=new ThreadString();//它是第三个开启的thread-2
                                                                                                //不管你开启没有它已经是一个线程存在了;
                                                                                                //你可以把这句话注释掉,就会发现是thread-1在了;

                Thread t1=new Thread(ti);

                //Thread t2=new Thread(ti);

                //Thread t3=new Thread(ts);

                //Thread t4=new Thread(ts);

                t1.start();

                //t2.start();

                //t3.start();

                //t4.start();

        }

}
回复 使用道具 举报
王晓新 发表于 2012-6-20 15:37
嗯,我试了一下,是这样的,但是并不是像邓杰同学说的,main是一个线程,但是这里的Thread-0其实是Thread ...

你确定 ?哥做出来确实是Thread-1在运行啊;
我是这样写的
class  ThreadTest
{
        public static void main(String[] args)
        {
             new Thread(new ThreadInt()).start();
        }
}

QQ截图20120620154829.png (1.84 KB, 下载次数: 36)

QQ截图20120620154829.png
回复 使用道具 举报
这是我的运行结果啊。你是不是搞错的;mian在任何时候都是做为一个线程存在的啊

1.png (28.54 KB, 下载次数: 48)

1.png

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 主线程的名字就是main,不是Thread-0.

查看全部评分

回复 使用道具 举报
邓杰 发表于 2012-6-20 15:48
你确定 ?哥做出来确实是Thread-1在运行啊;
我是这样写的
class  ThreadTest

:o我的确是这样写的啊,为嘛我的是Thread-0?
回复 使用道具 举报
王晓新 发表于 2012-6-20 16:03
我的确是这样写的啊,为嘛我的是Thread-0?

好吧, 这个不重要,重要的是你要记住main一定会占用一个线程的;不然你想想在一开启一个线程后那不是后面的代码就执行不了了吗;
回复 使用道具 举报
邓杰 发表于 2012-6-20 16:16
好吧, 这个不重要,重要的是你要记住main一定会占用一个线程的;不然你想想在一开启一个线程后那不是后 ...

我知道main线程是一直存在的啊,但对主线程和新建的其他进程之间是什么关系还是有点模糊
回复 使用道具 举报
  1. package hcy.test.main;

  2. class ThreadInt extends Thread
  3. {
  4.         public synchronized void run()
  5.         {
  6.                 System.out.println(Thread.currentThread().getName()+" ThreadInt");
  7.         }
  8. }
  9. class ThreadString extends Thread
  10. {
  11.         public synchronized void run()
  12.         {
  13.                 System.out.println(Thread.currentThread().getName()+" ThreadString ");
  14.         }
  15. }
  16. class  Test
  17. {
  18.         public static void main(String[] args) //main 线程
  19.         {
  20.                
  21.                     System.out.println(Thread.currentThread().getName());
  22.                 ThreadInt ti=new ThreadInt(); //Thread-0 线程
  23.                 ThreadString ts=new ThreadString(); //Thread-1 线程
  24.                 Thread t1=new Thread(ti);  //Thread-2 线程

  25.                 ti.start();
  26.                 t1.start();
  27.                 ts.start();

  28.         }
  29. }
复制代码
new Thread()及其子类就已经创建线程,即线程有了名字,thread.start()方法启动线程,并调用run方法。主线程是虚拟机创建的它有自己特殊的名字main
正常输出结果:
main
Thread-0 ThreadInt
Thread-2 ThreadInt
Thread-1 ThreadString

//t1.start();此语句被注释掉后输出结果:
main
Thread-0 ThreadInt
Thread-1 ThreadString

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
java虚拟机执行--->运行主线程---->执行代码让虚拟机建立其他线程-->继续运行-->结束
                                                                        |
                                                                建立其他线程1-->开始运行-->结束
                                                                建立其他线程2-->开始运行-->结束
他们之间是并行的关系...
                                                                 
回复 使用道具 举报
淡然 发表于 2012-6-20 16:34
new Thread()及其子类就已经创建线程,即线程有了名字,thread.start()方法启动线程,并调用run方法。主 ...

了然了:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马