java - 使线程以正确的方式工作

标签 java multithreading concurrency

我刚刚开始学习线程,却对它们的工作方式产生了误解。

这是我的类(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/

相关文章:

java - 不变性和可重载配置

java - 我写了一个通用的有序数组类,比较元素时插入方法出现空指针错误

java - 如何使用 Java/Spring Boot 在 MongoDB 中存储字符串列表

java - 处理来自客户端的多个请求并发送回相关响应

c# - 取消backgroundworker

windows - 当中央存储库位于 Windows 文件共享上时,与多个用户一起使用 git 是否安全?

concurrency - 为什么我的 go channel 被屏蔽了? (僵局)

java - 如果数据不变,我应该使用什么类型的Map?

java - Facebook4j 分页获取所有好友

Python - 在不同的线程上发送带有相同附件的多封电子邮件