Mic*_*ick 5 java concurrency multithreading
我刚刚开始学习线程并且误解了它们的工作方式.
这是我的班级:
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.
*/
Run Code Online (Sandbox Code Playgroud)
为什么我总是首先得到所有 "...开始"的消息,然后在"...已完成"的消息之后?无论我开始有多少线程,我总是看到:
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
Run Code Online (Sandbox Code Playgroud)
线程的目的不是并行执行吗?
也许我需要同步一些东西?还是犯了不小心的错误?要么…?
请解释.
更新:
我为什么不看,让我们说:
0 started
1 started
0 finished
2 started
1 finished
2 finished
Run Code Online (Sandbox Code Playgroud)
谢谢大家的治疗.
线程是平行的。否则,您会看到每个线程在下一个线程“开始”之前“完成”
减慢线程速度的一个简单方法是使用 Thread.sleep(10*1000); 休眠 10 秒(10,000 毫秒)
编辑:查看线程交错的一个简单方法是拥有固定大小的线程池。
ExecutorService pool = Executors.newFixedThreadPool(4);
for (int i = 0; i < 10; i++) {
final int id = i;
pool.submit(new Callable<Void>() {
public Void call() throws InterruptedException {
System.out.println(id + " started");
Thread.sleep(1000);
System.out.println(id + " finished");
return null;
}
});
}
Run Code Online (Sandbox Code Playgroud)
印刷
0 started
1 started
2 started
3 started
0 finished
4 started
1 finished
5 started
2 finished
6 started
3 finished
7 started
4 finished
8 started
5 finished
6 finished
9 started
7 finished
8 finished
9 finished
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |