使线程以正确的方式工作

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)

谢谢大家的治疗.

Pet*_*rey 2

线程是平行的。否则,您会看到每个线程在下一个线程“开始”之前“完成”

减慢线程速度的一个简单方法是使用 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)