用方法run()只是运行这个函数,还是在原来的线程中运行,没有产生新的线程,start()会产生新的线程,在类中加一个变量初始时设为false,下载成功后设为true.

解决方案 »

  1.   

    你的理解有误:
    run()方法是放置功能代码的地方(例如你的下载代码),它不能被程序直接调用。
    start()方法的作用就是启动线程,执行run()中的代码。
    至于判断线程是否正常结束,楼上的方法倒是没错,可以用置标志的方法实现。
      

  2.   

    同意ghw,run()不管能不能调,都没有必要调,判断线程是否正常结束用置标志.
      

  3.   

    run()是可以调用,但是重载run()的目的是使用线程,不用start()怎么启动?要是单纯为了调用一段代码何必用run()?放到一个单独的方法里直接用就行了!
      

  4.   

    我只是从技术上讨论run()被调用的可能性,而不是必要性。当然了,在真正编程的时候,谁也不会直接调用run()的
      

  5.   

    我同意ghw第一次的论点,run()是不能在这个class外被调用的。
      

  6.   

    你试一下就知道run()可以被其他类调用
      

  7.   

    give me an example. How to prove that I can call a method outside of this class?
      

  8.   

    你试过在一个线程外,NEW一个线程后,用RUN()方法能调出来吗?请回答别人问题的时候认真一些。
      

  9.   

    你做过什么试验???能帖出代码来吗?
    第一,能起动线程的唯一方法是START方法。一个线程如果已经起动,不能再次起动。如果已经死掉,会抛出一个EXCEPTION。你的RUN方法凭什么能够被这个线程外的方法CALL???
    第二,线程是不可逆的,一旦起动不可倒转,你凭什么在一个现程外用RUN方法让同一个线程再次从头一句执行,注意是同一个线程也就是同一个对象。
    第三,你做过试验,先不说你说话是否负责任,这样一个实验你是如何设计的能够证明你的这个线程被CALL以后输出的有效性,无论是这个线程正在执行还是已经死掉。有时候我真的觉得我们说话稍微不负责任就会对别人误导很大,误人误已还偏偏有人乐此不疲。
      

  10.   

    同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。之所以要在多线程中调用 start 而不是 run,是因为调用 Thread 类或它的子类中的 start 时,实际上 start 这个方法中向 JVM 中注册了自已这个线程以及这个线程在执行时实际的执行体 run,由 JVM 来负责线程的调度,由 JVM 决定什么时候来回叫你所提供的 run 来做实际的工作。通俗一点说: Thread 类把所有与线程调度有关的系统工作全部封装起来了,你只需要覆盖一个 run 方法,不论是通过直接继承还是利用实现 Runnable 接口, 告诉线程在它被调度到执行时所需要执行的实际工作,从而完成多线程的工作。直接调用 run 没有任何问题,只是它不会受 JVM 的线程调度所控制而已,也达不到你的多线程的目的而已。
      

  11.   

    xxmm 讲的和 masterz 讲得完全不是一回事。masterz 讲的是可以调用 run,如下:
    Thread t = new Thread( myRunnableClassInstance); // or Thread t = new MyThread();
    t.run();  // 这是可以的!这样做根本就不起动一个线程。xxmm 讲的是在调用 t.start(); 之后的事,在这个时候你说的才对。建议先搞清楚大家在说什么再下结论,不要人身攻击。
      

  12.   

    RUN方法包含了一个线程的WHOLE LIFECYCLE的所有动作,这个动作是不可逆不可重复的,如果我直接从外部CALL一个线程(是一个对象),告诉我这样算是什么? 这和多线程不多线程根本 就没有任何关系。
      

  13.   

    无知者无畏,你说的对,这是我问的第一个问题。我问过他如何证明他这个程序能够证明那个方法是可以被CALL的。你说这个实验根本就没有CALL那个方法。但是他再说他做了实验的话我就很气愤了,因为他如果确实做实验的话,就该设计好这个实验证明他的理论,不是在COMPILE时候不出错就行了,而是确实证明他的观点:这个方法确实被CALL了。
    我没有进行人身攻击,是有些人做事很不负责任。就象是学习时候很下功夫的去记住 老师告诉我们的每一句话,到最后却发现这个老师不负责任,告诉你的全是错的。或许你随便说一句话不要紧,但是对别人却可能很重要。我性子直,我就见不得别人这样,对自己不负责任我管不着,但是这是大家的地方,很多人都会有同样的问题,都会来看,害的就不止是一个人。
    如果不懂就是不懂,或是不能肯定就大大方方说自己不太清楚,干嘛弄得别人全都信以为真,拿着鸡毛当令箭。编程学习都挺辛苦,我只希望这种人少一些!!!
      

  14.   

    xxmm(晓箫):
    我认为我在上面发的帖子语气比较正常.不知道你是什么意思?
    别人对你的发言提出异议就用这种语气
      

  15.   

    我已经说过。这与跟我的意见一致不一致没有任何关系。
    我只是对于某些人自己并不能肯定一件事情或是没有认真做好实验的情况下不负责任的给别人以很肯定的错觉从而全听全信走错路而感到很生气。因为这有时候确实很耽误别人的。如果这只是个小实验那也就算了。如果这牵涉到一个很大的PROJECT,而程序的设计主体是一个线程能够从外部随意 CALL 它的RUN方法而重新执行一遍的话,这个后果意味着什么?意味着全组人努力可能就此一小点被毁掉了,我说的并不夸张!
    我觉得如果自己不是很有把握或是不是很肯定的话,要很HONEST的告诉别人,对自己也对别人负责。如果以很肯定的口气告诉别人的话,别人往往就会全听全信而自己不再加以验证,他的话当成书上的话。确实我们没有时间看很多的书,所以我们会来这里求助,如果求助的结果是没有结果的话,我们会去做实验去验证,或是我们会去查资料,然而如果有人在这里很不负责,别人就不会去做这些事情。
    我觉得这些道理很简单。这和跟我的观点一致不一致有什么关系?每个人都有自己不知道不懂的地方,谁是全才???这没有什么,我也不觉得如果我说错了被别人指出来有什么好生气的,如果别人指出我长期以来一个错误,我都不知道怎么感谢他呢!认识我的人都知道。我最乐意别人告诉我哪里做错了,哪里该做得更好。不过谁一旦这样做了那他躲都躲不掉我,我死活都要做人家学生。我也从来不会给别人瞎指挥。大家都是搞程序的,我们这一行性格都差不多,开朗随便,没什么心眼。但是就是在一些生死攸关的问题绝不能有一点含糊,因为这不只是一个人的问题,是全组人员的事情。我们的任务是铲除一切的BUG,而不是因为自己的随意而带来不必要的BUG,甚至潜意识的强加给别人一个很严重的BUG!
      

  16.   

    更正你的猜想:我不是做过试验,是在工作中做过的(调用一个继承了Thread类的run()).你认为我那一句话不对,请讲清楚,否则我认为你是无理取闹
      

  17.   

    没有什么猜想不猜想的。你把你的代码可以SUBMIT给JAVA。SUN。COM,告诉他们,他们必须重新写THREAD的SPECIFICATION。因为你可以不通过START就能够起动一个线程,这么大的一个BUG,你会得到奖金,免费的软件,还可以总是提前得到他们新版本的产品请你去测试。如果你不屑于这点小奖,那么请把你的代码帖出来,因为想要这样优厚待遇的人不少。我也是期中之一。谢谢!
      

  18.   

    你认为我那一句话不对,请讲清楚
    我在什么地方说过直接调用run()会启动一个新的线程?
      

  19.   

    我已经重复过了。
    第一:一个线程如果已经启动,这个过程是不可逆的,那么,你这个RUN如果能够被CALL的话,你告诉我,它该从哪里执行?
    第二:如果已经死了的话,你这个RUN又该从哪里执行?
    第三:如果根本就从来没有起动过,而你的RUN能够被执行那又意味着什么???
    答案是:
    第一,一个线程的过程可以从任一点从头开始(这是根本不可能的!如果你学过操作系统的话)
    第二,JAVA可以实现一个已经不存在的对象仍然执行它的方法而有效!
    第三:就是RUN可以起动一个未被起动的线程。现在您能给我们看看你那段代码吗???
      

  20.   

    wuqiuzi:
    真是对不起,在你的地盘上说了这么多与你的问题无关的话,但是我实在气不过,莫名其妙地被人攻击!
    对于你的问题我在补充一点:下载的线程要有2个标志:一个是标记是否执行完成,一个是下载是否成功,也许还要再加上是否继续的标志(否则某些线程由于各种原因费时太多而不能完成,还不如产生新的线程重新下载这一段)
      

  21.   

    回复人: kevindude(kevin) (2001-7-26 0:14:55)  得0分 
    run()是可以被调用的  
    同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。
    他们都说过run()可以被调用,你可以问他们要代码
    我没兴趣写,我想知道的是为什么莫名其妙地被人攻击!
      

  22.   

    我说过我不觉得我这是人身攻击,这也不是某一个人的地盘。因为任何对这个问题感兴趣的人都会进来看一看,而任何一个人都会因为我们不负责任的话而误导很多的人甚至犯下很严重的错误。为什么你不能再肯定一点的告诉别人可以用调RUN的方法来做,因为你确实已经做过并且运行成功呢?我们来这里是来吸取经验节省时间的,而不是来这里汲取BUG浪费时间的。SIR!我已经回答了你的每一个问题。还有什么疑问的话找本书或是真的好好做做你的实验再来这里给人家当老师。
      

  23.   

    我上面的帖 你看不到吗?
    RUN是不可被从类外直接调用的。再帖到这里你看吧,再看不到那就没办法了。
    ----------------------------------------------------------------------------
    第一:一个线程如果已经启动,这个过程是不可逆的,那么,你这个RUN如果能够被CALL的话,你告诉我,它该从哪里执行?
    第二:如果已经死了的话,你这个RUN又该从哪里执行?
    第三:如果根本就从来没有起动过,而你的RUN能够被执行那又意味着什么???
    答案是:
    第一,一个线程的过程可以从任一点从头开始(这是根本不可能的!如果你学过操作系统的话)
    第二,JAVA可以实现一个已经不存在的对象仍然执行它的方法而有效!
    第三:就是RUN可以起动一个未被起动的线程。现在您能给我们看看你那段代码吗??? 
      

  24.   

    这已经写了三次了。你再看不到没办法了,我还想给服务器省点空间。
    现在拿出你能证明RUN可被直接调用的代码来。
      

  25.   

    回复人: luodi(无知者无畏) (2001-7-28 11:59:55)  得0分 
    同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。 
    回复人: xxmm(晓箫) (2001-7-28 12:14:29)  得0分 
    无知者无畏,你说的对 上面不是别人冒充你说的吧
      

  26.   

    我说的对是指无知无畏举的那个实验的例子,那个例子事实上根本无法执行里面的动作。有你这么断章取义的吗???你看我后面写的什么???我说那个例子正是我为什么问你“How to prove that I can call a method outside of the class?"因为那个实验在COMPILE时候是通过的。你连这个都不知道吗???但是无知者无畏注释到这样根本无法启动这个线程,这意味着什么?这意味着里面的代码根本无法被执行。你怎么CALL它???
      

  27.   

    我懒得跟你费话了。你爱怎么想怎么想吧。你喜欢CALL RUN就CALL。我只希望别有太多的人辛辛苦苦跑上网,跑到这里没想到凭白无故吃一嘴BUG回去。
      

  28.   

    masterz,你帖那些帖想问我为什么我只针对你。我想我的语气可能是显得有些气愤,但是你要知道,没有一个人说他做过并且能够运行了,没有什么事情比这个更有说服力了但是只有你说了,而且你在说一个根本不可能存在的情况。无论别人怎么说,WUQIZI都还有可能怀疑一些,都有可能自己去做实验去查,然而一旦有了这个事实,没人会去再做这些事情了,为什么?因为我们到这里就是来寻求这样的帮助,以往的经验,而不是重蹈前人的覆辙。可能你是无意。我只希望,大家除了对自己,对别人也都有一点最起码的道德观。都知道做程序员也不容易,何必搞得别人平白无帮更辛苦呢?
    这件事就此为止。我来这里才三四天,泡过一天。但是我已经不再信任这里。因为你的缘故。
    说句老实话,当你那样毫不畏惧的说你做过这样的程序的时候,我简直是很惊讶。我对别人很负责,我对自己更负责。我希望能这里是一个学术作风严谨的论坛,哪怕这个论坛的人水平都不怎么样,但是大家互相取长补短,一起讨论,我的进步也会比在这里听人告诉我他已经验证过一个根本不可能存在的概念要快得多。
      

  29.   

    to xxmm:  你可能对我举的例子有点误解了。
    “我说的对是指无知无畏举的那个实验的例子,那个例子事实上根本无法执行里面的动作。” 实际上可以执行里面的动作。
    “但是无知者无畏注释到这样根本无法启动这个线程,这意味着什么?这意味着里面的代码根本无法被执行。你怎么CALL它??? ” 无法启动的是新的线程,但里面的代码也执行了。public class MyRun implements Runnable {
      static int count = 0;  public MyRun() {
        count ++;
      }  public void run() {
         System.out.println("Hei, I'm thread " + count + " and I'm running.....");
      }  public static void main(Strings arg[]) {
        MyRun arrayT[] = { new MyRun(), new MyRun(), new MyRun() };
        Thread t = new Thread(new MyRun());
        t.run();  // 这里一样会执行 run 里面的内容,只不过不另起一个新线程,而是就在 main 线程里执行
        for( int i=0; i < arrayT.length; i ++ ) {
          arrayT[i].start();   // 这里是多线程部分
        }
      }
    }这个例子是可以执行的,就算不用 start 也一样会执行 run() 里的内容的,你可以试一下。
    我只不过想说,这样的执行方法不是另起一个新线程,不符合你想要多线程的原意,而不是说不能执行。其实我觉得 masterz 讲的意思也就是我这个意思。另外,不管你是不是对 CSDN 失去信心也好,对别人或我失去信心也好,其实在这里的人还是基本上在讨论技术的,说话的时候确实要注意口气。
      

  30.   

    对不起,我的例子代码打错了,应该改写一句如下:arrayT[i].start();  ====>  new Thread(arrayT[i]).start();
      

  31.   

    :xxmm(晓箫),人家说作过实验,或尝试过,那就说明是可执行的,不要为你所谓的理论所一再的强调,找出反例,自己动手试试!