同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。之所以要在多线程中调用 start 而不是 run,是因为调用 Thread 类或它的子类中的 start 时,实际上 start 这个方法中向 JVM 中注册了自已这个线程以及这个线程在执行时实际的执行体 run,由 JVM 来负责线程的调度,由 JVM 决定什么时候来回叫你所提供的 run 来做实际的工作。通俗一点说: Thread 类把所有与线程调度有关的系统工作全部封装起来了,你只需要覆盖一个 run 方法,不论是通过直接继承还是利用实现 Runnable 接口, 告诉线程在它被调度到执行时所需要执行的实际工作,从而完成多线程的工作。直接调用 run 没有任何问题,只是它不会受 JVM 的线程调度所控制而已,也达不到你的多线程的目的而已。
xxmm 讲的和 masterz 讲得完全不是一回事。masterz 讲的是可以调用 run,如下: Thread t = new Thread( myRunnableClassInstance); // or Thread t = new MyThread(); t.run(); // 这是可以的!这样做根本就不起动一个线程。xxmm 讲的是在调用 t.start(); 之后的事,在这个时候你说的才对。建议先搞清楚大家在说什么再下结论,不要人身攻击。
回复人: luodi(无知者无畏) (2001-7-28 11:59:55) 得0分 同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。 回复人: xxmm(晓箫) (2001-7-28 12:14:29) 得0分 无知者无畏,你说的对 上面不是别人冒充你说的吧
我说的对是指无知无畏举的那个实验的例子,那个例子事实上根本无法执行里面的动作。有你这么断章取义的吗???你看我后面写的什么???我说那个例子正是我为什么问你“How to prove that I can call a method outside of the class?"因为那个实验在COMPILE时候是通过的。你连这个都不知道吗???但是无知者无畏注释到这样根本无法启动这个线程,这意味着什么?这意味着里面的代码根本无法被执行。你怎么CALL它???
run()方法是放置功能代码的地方(例如你的下载代码),它不能被程序直接调用。
start()方法的作用就是启动线程,执行run()中的代码。
至于判断线程是否正常结束,楼上的方法倒是没错,可以用置标志的方法实现。
第一,能起动线程的唯一方法是START方法。一个线程如果已经起动,不能再次起动。如果已经死掉,会抛出一个EXCEPTION。你的RUN方法凭什么能够被这个线程外的方法CALL???
第二,线程是不可逆的,一旦起动不可倒转,你凭什么在一个现程外用RUN方法让同一个线程再次从头一句执行,注意是同一个线程也就是同一个对象。
第三,你做过试验,先不说你说话是否负责任,这样一个实验你是如何设计的能够证明你的这个线程被CALL以后输出的有效性,无论是这个线程正在执行还是已经死掉。有时候我真的觉得我们说话稍微不负责任就会对别人误导很大,误人误已还偏偏有人乐此不疲。
Thread t = new Thread( myRunnableClassInstance); // or Thread t = new MyThread();
t.run(); // 这是可以的!这样做根本就不起动一个线程。xxmm 讲的是在调用 t.start(); 之后的事,在这个时候你说的才对。建议先搞清楚大家在说什么再下结论,不要人身攻击。
我没有进行人身攻击,是有些人做事很不负责任。就象是学习时候很下功夫的去记住 老师告诉我们的每一句话,到最后却发现这个老师不负责任,告诉你的全是错的。或许你随便说一句话不要紧,但是对别人却可能很重要。我性子直,我就见不得别人这样,对自己不负责任我管不着,但是这是大家的地方,很多人都会有同样的问题,都会来看,害的就不止是一个人。
如果不懂就是不懂,或是不能肯定就大大方方说自己不太清楚,干嘛弄得别人全都信以为真,拿着鸡毛当令箭。编程学习都挺辛苦,我只希望这种人少一些!!!
我认为我在上面发的帖子语气比较正常.不知道你是什么意思?
别人对你的发言提出异议就用这种语气
我只是对于某些人自己并不能肯定一件事情或是没有认真做好实验的情况下不负责任的给别人以很肯定的错觉从而全听全信走错路而感到很生气。因为这有时候确实很耽误别人的。如果这只是个小实验那也就算了。如果这牵涉到一个很大的PROJECT,而程序的设计主体是一个线程能够从外部随意 CALL 它的RUN方法而重新执行一遍的话,这个后果意味着什么?意味着全组人努力可能就此一小点被毁掉了,我说的并不夸张!
我觉得如果自己不是很有把握或是不是很肯定的话,要很HONEST的告诉别人,对自己也对别人负责。如果以很肯定的口气告诉别人的话,别人往往就会全听全信而自己不再加以验证,他的话当成书上的话。确实我们没有时间看很多的书,所以我们会来这里求助,如果求助的结果是没有结果的话,我们会去做实验去验证,或是我们会去查资料,然而如果有人在这里很不负责,别人就不会去做这些事情。
我觉得这些道理很简单。这和跟我的观点一致不一致有什么关系?每个人都有自己不知道不懂的地方,谁是全才???这没有什么,我也不觉得如果我说错了被别人指出来有什么好生气的,如果别人指出我长期以来一个错误,我都不知道怎么感谢他呢!认识我的人都知道。我最乐意别人告诉我哪里做错了,哪里该做得更好。不过谁一旦这样做了那他躲都躲不掉我,我死活都要做人家学生。我也从来不会给别人瞎指挥。大家都是搞程序的,我们这一行性格都差不多,开朗随便,没什么心眼。但是就是在一些生死攸关的问题绝不能有一点含糊,因为这不只是一个人的问题,是全组人员的事情。我们的任务是铲除一切的BUG,而不是因为自己的随意而带来不必要的BUG,甚至潜意识的强加给别人一个很严重的BUG!
我在什么地方说过直接调用run()会启动一个新的线程?
第一:一个线程如果已经启动,这个过程是不可逆的,那么,你这个RUN如果能够被CALL的话,你告诉我,它该从哪里执行?
第二:如果已经死了的话,你这个RUN又该从哪里执行?
第三:如果根本就从来没有起动过,而你的RUN能够被执行那又意味着什么???
答案是:
第一,一个线程的过程可以从任一点从头开始(这是根本不可能的!如果你学过操作系统的话)
第二,JAVA可以实现一个已经不存在的对象仍然执行它的方法而有效!
第三:就是RUN可以起动一个未被起动的线程。现在您能给我们看看你那段代码吗???
真是对不起,在你的地盘上说了这么多与你的问题无关的话,但是我实在气不过,莫名其妙地被人攻击!
对于你的问题我在补充一点:下载的线程要有2个标志:一个是标记是否执行完成,一个是下载是否成功,也许还要再加上是否继续的标志(否则某些线程由于各种原因费时太多而不能完成,还不如产生新的线程重新下载这一段)
run()是可以被调用的
同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。
他们都说过run()可以被调用,你可以问他们要代码
我没兴趣写,我想知道的是为什么莫名其妙地被人攻击!
RUN是不可被从类外直接调用的。再帖到这里你看吧,再看不到那就没办法了。
----------------------------------------------------------------------------
第一:一个线程如果已经启动,这个过程是不可逆的,那么,你这个RUN如果能够被CALL的话,你告诉我,它该从哪里执行?
第二:如果已经死了的话,你这个RUN又该从哪里执行?
第三:如果根本就从来没有起动过,而你的RUN能够被执行那又意味着什么???
答案是:
第一,一个线程的过程可以从任一点从头开始(这是根本不可能的!如果你学过操作系统的话)
第二,JAVA可以实现一个已经不存在的对象仍然执行它的方法而有效!
第三:就是RUN可以起动一个未被起动的线程。现在您能给我们看看你那段代码吗???
现在拿出你能证明RUN可被直接调用的代码来。
同意 masterz,所有的 public 声明的方法都可以在任何外部类中调用,不会因为它的名字是 run 而有什么不同。
回复人: xxmm(晓箫) (2001-7-28 12:14:29) 得0分
无知者无畏,你说的对 上面不是别人冒充你说的吧
这件事就此为止。我来这里才三四天,泡过一天。但是我已经不再信任这里。因为你的缘故。
说句老实话,当你那样毫不畏惧的说你做过这样的程序的时候,我简直是很惊讶。我对别人很负责,我对自己更负责。我希望能这里是一个学术作风严谨的论坛,哪怕这个论坛的人水平都不怎么样,但是大家互相取长补短,一起讨论,我的进步也会比在这里听人告诉我他已经验证过一个根本不可能存在的概念要快得多。
“我说的对是指无知无畏举的那个实验的例子,那个例子事实上根本无法执行里面的动作。” 实际上可以执行里面的动作。
“但是无知者无畏注释到这样根本无法启动这个线程,这意味着什么?这意味着里面的代码根本无法被执行。你怎么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 失去信心也好,对别人或我失去信心也好,其实在这里的人还是基本上在讨论技术的,说话的时候确实要注意口气。