作者dream1124 (全新开始)
看板java
标题Re: [问题] thread run VS start
时间Tue Nov 19 08:25:16 2013
※ 引述《togs (= =")》之铭言:
: 之前写的程式不断出错,上网查才大略知道thread 的run和start差异
: 在网路上看到的讲义,
: 讲义里做出label(图片)移动的方式是用thread.start();
: 但当我将thread放在method里头时,例如:
: static void voidTestInVoid(){
: System.out.println("voidTestInVoid beginning");
: thread = new addThread1("abc"); //print出abc
: thread.start();
: thread = new addThread1("cde");
: thread.start();
: System.out.println("voidTestInVoid end");
: }
: 我发现在执行 voidTestInVoid(); 时
: 每次执行print出来的文字顺序都会不一样,特别是不会从上而下照顺序执行
你知道 thread 是什麽东西吗? 这是执行绪
你呼叫 start 的时候,jvm会帮你开一个执行绪,
在新的执行绪执行 thread 里面 run 方法的内容。
呼叫 run 的话就只是在原本的执行绪执行一个很普通的方法。
就结果而言,为了强化效能,
jvm 本来就不保证跨执行绪的程式在编译成byte code 之後
彼此之间有什麽固定的执行顺序,
而在同一个执行绪的程式则有一定的先後顺序关系,
因此呈现在同一个命令列里面的文字顺序每次都不一样是很正常的。
先去了解一下执行绪的观念,你就不会有我删掉的後面这些问题
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.168.65.88
1F:推 togs:感谢,您解释地相当清楚:) 我确实没将thread搞懂 受教了:) 11/19 10:13
2F:→ PsMonkey:是 multi-thread 本身的特性,跟 JVM 与否应该无关 11/19 10:43
多执行绪函式库的实作都有规格,就算有惯例的做法,
但规格没限制的地方,没有什麽是「天性如此」的。
我相信愿意找的话一定会有某个 jvm 实作执行他的程式以後,
在命令列的输出结果符合他原本的预期,但我要强调不管哪一种输出结果都不用意外
3F:→ Killercat:run()只是单纯的去call run()里面的程式码而已 11/19 10:52
4F:→ Killercat:跟你随便做一个class跑里面的method一样 这样比较好懂? 11/19 10:56
※ 编辑: dream1124 来自: 118.168.124.48 (11/19 19:20)
5F:推 togs:相当好懂:) many thanks^^ 11/20 06:50
6F:推 ah7675:繷W格有什麽关系? 是scheduling 还有context switch 11/24 01:22
7F:→ ah7675:规格 11/24 01:23