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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张海洋 中级黑马   /  2013-3-22 23:28  /  1447 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张海洋 于 2013-3-23 19:29 编辑

启动一个线程是用run()还是start()?

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-23 17:28

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 陈腾跃_2013 于 2013-3-22 23:34 编辑

按你的意思,是start()!
run()是一个方法,可以在子类中覆盖,在线程启动的时候会调用。

eg:
class Demo extends Thread
{
    //覆盖成自定义方法
    public void run()
    {
        System.out.println("Demo run");
    }
}

class ThreadDemo
{
    public static void main(String[] args)
    {
        Demo d = new Demo();
        d.start();//启动线程调用run方法
    }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
创建线程一:继承Thread类

步骤:定义类继承Thread。

复写Thread类中的run方法。

目的:将自定义的代码存储在run方法,让线程运行。

调用线程的start方法。

(该方法两个作用:启动线程,调用run方法)


Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码。就是run方法。

也就是说Thread类中的run方法,用于存储线程要运行的代码。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
class ThreadDemo1 {
       
        public static void main(String[] args) {
                MyThread mt = new MyThread();        // 4.创建线程对象
                mt.start();                        // 5.开启新线程, 内部会自动执行run方法
               
                for (int i = 0; i < 1000; i++)
                        System.out.println("A");
        }
               
}

class MyThread extends Thread {                        // 1.定义类继承Thread
        public void run() {                        // 2.重写run方法
                for (int i = 0; i < 1000; i++)        // 3.把新线程要做的事写在run方法中
                        System.out.println("B");
        }
}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
呵呵  这个错误我在刚看完线程的时候就犯过  所有比较深刻   一定要用start  如果用run的话 你只是调用的那个类的run方法 并没有启动线程 那么结果就是:run方法中的代码
只执行一次 或者是循环的话就会执行完再接着从主线程继续往下走

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
start()
回复 使用道具 举报
启动线程使用start()方法,不能是run()方法。
因为:   调用start()方法启动线程,系统会把该run()方法当成线程执行体来处理;但如果直接调用线程对象的run()方法,则run()方法立即就被执行,而且在run()方法放回之前其他线程无法并发执行,也就是说,系统会把线程对象当成一个普通对象,而run()方法也即是一个普通的方法,而不是线程执行体;例如:
{
//下面两行代码并不会启动两个线程,而是依次执行两个run()方法
//(thread1是一个继承Thread的线程对象)
new thread1().run();
new thread1().run();
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马