黑马程序员技术交流社区

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

作者: 我能驾驭住    时间: 2012-6-8 18:16
标题: 线程问题
package Thread.lianxi;

import com.sun.org.apache.bcel.internal.generic.D2F;

class Demo extends Thread{
        @Override
        public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < 3; i++) {
                        System.out.println("two");
                }
        }
}


public class ThreadDemo1 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
               
                Demo d1=new Demo();
                Demo d2=new Demo();
                d1.start();
            d2.start();
            //d1.run();//它仅仅是一个调用对象而已,只是建立线程,没有运行?是什么意思?
            //d2.run();
         for (int i = 0; i < 3; i++) {
                System.out.println("one");
        }

        }

}


它仅仅是一个调用对象而已,只是建立线程,没有运行?是什么意思?

作者: 杨天皓    时间: 2012-6-8 18:23
你dome类里面的run方法是值覆盖了Thread类中的run   d1.run();  你只是通过Demo的实力对象去调用了这个run方法。
而你要启动线程是需要start()的.
作者: 梁小波    时间: 2012-6-8 18:25
正如你看到的run方法中没有开启线程的代码;只有运行的代码;所以真正的是为线程做准备的是start;他会为开启线程做一个前期的准备;比如建立对象,准备资源的;
在start中会调用run方法;run中只是代码没有其他的东西;所以如你所说的;
作者: 我能驾驭住    时间: 2012-6-8 18:49
package Thread.lianxi;
//一个程序至少有一个线程存在

class Demo extends Thread {

        private String name;

        public Demo(String name) {

                //this.name = name;//这两个结果为什么不一样呢??
                super(name);
        }

        @Override
        public void run() {
                // TODO Auto-generated method stub
                for (int i = 0; i < 3; i++) {
                        // System.out.println(this.getName()+"run");
                        System.out.println(Thread.currentThread().getName() + "....run");
                        // 线程的默认名称,是Thread-0,Thread-1.........排序的,通过getName()方法获取;
                        // currentThread()获取当前线程对象,是静态的,用类名调用!格式:Thread.currentThread()
                }

        }
}

public class ThreadDemo1 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                Demo d1 = new Demo("one");//两个线程 交叉运行
                Demo d2 = new Demo("two");//
                d1.start();// 开启线程,执行run()方法;
                d2.start();
                // d1.run();//它仅仅是一个调用对象而已,只是建立线程,没有运行?是什么意思?
                // d2.run();
                for (int i = 0; i < 3; i++) {
                        System.out.println("....main");
                }

        }

}

作者: 我能驾驭住    时间: 2012-6-8 18:50
//this.name = name;//这两个结果为什么不一样呢??
                super(name);
System.out.println(Thread.currentThread().getName() + "....run");
                        // 线程的默认名称,是Thread-0,Thread-1.........排序的,通过getName()方法获取;
                        // currentThread()获取当前线程对象,是静态的,用类名调用!格式:Thread.currentThread()

作者: 潘东升    时间: 2012-6-8 18:57
d1.run()---它不是一个调用对象,而是对象在调用它自己的run方法而已,你在前面创建对象就是创建了线程,但是调用run方法并不会启动线程,这就是run方法和start方法的区别:调用start方法相当于是启动线程并调用run方法,而调用run方法就只是当普通方法调用而已。
作者: 葛奎    时间: 2012-6-8 19:09
线程是控制进程执行的基本单元.     
1,通过Tread类可以创建一个线程,并且可以启动运行,
2,一个线程所要运行的内容是写在run()方法里面的, (创建一个线程想要用它来做什么事情)
3, Demo d=new Demo();  d.run(); 这个是普通地创建了一个Demo对象,并且调用了run方法  它是属于主线程里面的东东,并没有启动另一个线程
4,d.start()是启用线程,只有调用start()这个方法线程才能运行





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