我刚刚开始学习线程,却对它们的工作方式产生了误解。
这是我的类(class):
public class MyThread extends Thread {
private static int NUM = 0;
private int id;
public MyThread() {
id = NUM++;
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new MyThread().start();
}
}
public void run() {
System.out.println(id + " started");
try {
Process p = Runtime.getRuntime().exec("javac -version");
p.waitFor();
} catch (Exception e) {
System.out.println("Call a doc!");
}
System.out.println(id + " finished");
}
}
/*
Just a sidenote.
I am creating new javac process just to slow an application down.
Simple System.out.println(…) is a way faster.
*/
为什么我总是首先收到所有“...开始”消息,然后是“...完成”消息?无论我启动了多少个线程,我总是看到:
0 started
1 started
2 started
3 started
4 started
5 started
6 started
7 started
8 started
9 started
0 finished
1 finished
3 finished
4 finished
8 finished
5 finished
2 finished
6 finished
9 finished
7 finished
线程的目的不就是并行执行吗?
也许我需要同步一些东西?还是犯了粗心的错误?或者……?
请解释。
更新:
为什么我看不到,让我们说:
0 started
1 started
0 finished
2 started
1 finished
2 finished
谢谢大家的治疗。
最佳答案
看起来不错。您可以从输出中看到线程正在交错。线程正在启动、进行上下文切换并被调度程序选中,例如,您可以看到线程 8 跳到线程 5 之前的位置。如果所有的数字都按顺序排列,那会很奇怪,但这似乎很好。
按照 Peter Lawrey 的建议,使用 hibernate 时间,这样您就可以更轻松地更改每个线程花费的时间。正如您的示例所示,启动一个进程需要花费很多时间,因此您的所有线程都应该在完成之前启动似乎是合理的。
关于java - 使线程以正确的方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379652/