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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏儒日 中级黑马   /  2012-7-20 12:35  /  2269 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建一个线程,要么就继承Thread覆盖run()方法,要么定义类实现Runnable接口、覆盖Runnable接口中的run方法将线程要运行的代码存放在run方法中。多线程类又是先运行start方法,start方法实际上是调用run方法.我不明白的地方是run()方法能否被多次调用呢?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 罗京雨 于 2012-7-20 13:56 编辑

我的理解是run()能多次调用。假如你new了两个对象,d1.start();d2.start()。start方法做了两件事:1,开启了线程让线程可以运行,2,调用了run方法。两个对象都运行,调用完一个run(),然后run()就出栈了,接着第二个对象在调用在出栈。

                调用run方法和调用start方法的区别:
                调用run方法,仅仅是一般对象在调用对象中的方法,并没有开启线程,
                还有主线程来完成的run方法的运行。

                调用start方法,是开启了一个线程(一个新的执行路径。)
                这个线程去执行了run方法。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 包晗 于 2012-7-20 14:44 编辑

run 方法是可以多次使用的      
run方法是线程运行的主方法,存储要单独完成的代码
查阅无数帖子后发现 多次启动一个线程是非法的
当线程已经结束执行后,不能再重新启动RUN
(相同线程不能多次使用,即start)

查阅API   
     使用实现接口 Runnable 的对象创建一个线程时,
启动该线程将导致在独立执行的线程中调用对象的run 方法。   
使用实现接口 Runnable 的对象创建一个线程时,
启动该线程将导致在独立执行的线程中调用对象的 run 方法。
  1. class Demo extends Thread
  2. {
  3. public void run()
  4. {
  5. for(int x=0;x<10;x++)
  6. System.out.println("Demo ..........RUN"+x);
  7. }
  8. }



  9. class ThreadDemo
  10. {
  11. public static void main(String[] args)
  12. {
  13. Demo d =new Demo();
  14. d.start();//d.run();
  15. d.start();  // d.run();   run 可以多次使用  start 不行


  16. for (int x=0;x<10 ;x++ )
  17. {
  18. System.out.println("THread run 方法"+x);
  19. }

  20. }
  21. }
复制代码
连续使用2个 相同的start  系统会报错   如上面代码中的 d.start


但是 使用 2个  d.run();  程序会运行下去

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
class Ticket implements Runnable
{
        public void run()
        {
        }
}
class  TiktDemo
{
        public static void main(String[] args)
        {
                Thread t1 = new Thread(t);//创建一个线程
                Thread t2 = new Thread(t);//创建一个线程
                t1.start();//开启t1线程,调用run方法
                t2.start();//开启t2线程,调用run方法
        }
}run方法能被多次调用。只要开启了线程,该线程就会调用run方法。
回复 使用道具 举报
我刚才查了下,你可以看看这里讲解的,http://www.cnblogs.com/linjiqin/archive/2011/04/10/2011272.html
回复 使用道具 举报
这个run方法是我们调用start之后自定义线程开始执行的入口。
当线程开始执行了。它就只能进入一次run方法,将里面的语句都执行完毕。结束这个run方法,线程也就随之结束。
一个线程在从建立到消亡,它只调用了一次自己的入口run方法。不能被多次调用。
就好比main方法。一个程序只能有这么一个入口,main方法结束,主线程就结束了。这是一个线程的消亡。
run()方法的作用其实就充当了你自定义线程的入口。相当于主线程的main入口,没有这个入口线程就不能启动。
回复 使用道具 举报
一个start方法调用一个run方法
回复 使用道具 举报
如果是同一个线程,不可重复启动,否则会报 “ java.lang.IllegalThreadStateException ”异常。如果使用同一个线程类,new出多个线程来,则可以,因为new出来的是不同的线程。
回复 使用道具 举报
芦曦 发表于 2012-7-20 14:05
class Ticket implements Runnable
{
        public void run()

如果调用再次t1.start(),run方法也被多次调用了,但此时会报“ java.lang.IllegalThreadStateException ” 异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马