黑马程序员技术交流社区

标题: 多线程问题 [打印本页]

作者: 王晓新    时间: 2012-6-20 15:16
标题: 多线程问题
本帖最后由 王晓新 于 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,不知道什么原因
作者: 王晓新    时间: 2012-6-20 15:23
附图:  

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

QQ截图20120620152307.jpg

作者: 黑马-唐磊    时间: 2012-6-20 15:27
那是跟你电脑的cpu有关,只有2线程抢到资源,0和1没有抢到资源,你把i的范围增大就可能解决以上问题
作者: 李天甲    时间: 2012-6-20 15:28
代码没问题啊,呵呵呵

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

可见,线程的名称是创建线程对象时分配的,而不是开始跑的时候呵呵呵

作者: 邓杰    时间: 2012-6-20 15:31
因为你的程序现在总共就是三个线程啊、 main是一个吧;他是第一个执行的所以应该是Thread-0;ThreadString ts=new ThreadString();是一个,虽然没有开始运行;但他已经把Thread-1占了;也就是他已经在内存中存在只是还没有开始运行起来;你可以把t1.start()注释开启ts.start();验证一下;
作者: 车风波    时间: 2012-6-20 15:31
线程对象创建了就有名字了。
ThreadInt ti=new ThreadInt();//Thread-0
  ThreadString ts=new ThreadString();//Thread-1
  Thread t1=new Thread(ti);//Thread-2
作者: 唐辉辉    时间: 2012-6-20 15:34
本帖最后由 唐辉辉 于 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();
        }
}



作者: 王明明    时间: 2012-6-20 15:36
本帖最后由 王明明 于 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:37
车风波 发表于 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.
作者: 邓杰    时间: 2012-6-20 15:39
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:48
王晓新 发表于 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

作者: 邓杰    时间: 2012-6-20 15:57
这是我的运行结果啊。你是不是搞错的;mian在任何时候都是做为一个线程存在的啊

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

1.png

作者: 王晓新    时间: 2012-6-20 16:03
邓杰 发表于 2012-6-20 15:48
你确定 ?哥做出来确实是Thread-1在运行啊;
我是这样写的
class  ThreadTest

:o我的确是这样写的啊,为嘛我的是Thread-0?
作者: 邓杰    时间: 2012-6-20 16:16
王晓新 发表于 2012-6-20 16:03
我的确是这样写的啊,为嘛我的是Thread-0?

好吧, 这个不重要,重要的是你要记住main一定会占用一个线程的;不然你想想在一开启一个线程后那不是后面的代码就执行不了了吗;
作者: 王晓新    时间: 2012-6-20 16:22
邓杰 发表于 2012-6-20 16:16
好吧, 这个不重要,重要的是你要记住main一定会占用一个线程的;不然你想想在一开启一个线程后那不是后 ...

我知道main线程是一直存在的啊,但对主线程和新建的其他进程之间是什么关系还是有点模糊
作者: 淡然    时间: 2012-6-20 16:34
  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
作者: 李天甲    时间: 2012-6-20 16:36
java虚拟机执行--->运行主线程---->执行代码让虚拟机建立其他线程-->继续运行-->结束
                                                                        |
                                                                建立其他线程1-->开始运行-->结束
                                                                建立其他线程2-->开始运行-->结束
他们之间是并行的关系...
                                                                 
作者: 王晓新    时间: 2012-6-20 16:41
淡然 发表于 2012-6-20 16:34
new Thread()及其子类就已经创建线程,即线程有了名字,thread.start()方法启动线程,并调用run方法。主 ...

了然了:handshake




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2