java - 线程执行中不可预测的行为(Head First Java 示例)

标签 java multithreading

page 498 of Head First Java

首先我不知道他们为什么把main方法写在ThreadTestDrive类中,然后我去他们的网站下载了下面这段代码:

public class MyRunnable implements Runnable{

public void run()
{
    go();
}

public void go() {
    doMore();
}

public void doMore() {
    System.out.println("top o' the stack");
}

public static void main(String[] args)
{
    Runnable threadJob = new MyRunnable();
    Thread myThread = new Thread(threadJob);
    myThread.start();
    System.out.println("back in main");
}}

每次我运行此代码时,输​​出始终是“堆栈顶部”上方的“返回主”,这并不像他们所说的那样不可预测,为什么?

最佳答案

对于最近的多核CPU,“相当期望”如此快速的处理,例如System.out.println("back in main")当前运行线程中调用的语句发生在新启动的线程有效运行之前。
由于在输出中他们很容易获得不可预测的行为,我想他们是用有限的 CPU 进行测试的。
我个人认为他们可以找到一个结果最常见/最容易不可预测的例子。

例如,创建 4 个(或更多)同时启动的线程,您将很容易看到不同的行为。
由于线程“大约”同时启动,因此它们之间的执行具有真正的并发性:

public class MyRunnable implements Runnable {

    private int count;

    public MyRunnable(int count) {
        this.count = count;
    }

    public void run() {
        go();
    }

    public void go() {
        doMore();
    }

    public void doMore() {
        System.out.println("doMore(), count=" + count);
    }

    public static void main(String[] args) {
        new Thread(new MyRunnable(1)).start();
        new Thread(new MyRunnable(2)).start();
        new Thread(new MyRunnable(3)).start();
        new Thread(new MyRunnable(4)).start();
    }
}

输出(第一次尝试):

doMore(), count=2

doMore(), count=4

doMore(), count=3

doMore(), count=1

输出(第二次尝试):

doMore(), count=1

doMore(), count=4

doMore(), count=3

doMore(), count=2

关于java - 线程执行中不可预测的行为(Head First Java 示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49709222/

相关文章:

java - 如何创建Rest API并增加处理时间?

java - 发送未知类的 Java 对象

java - SonarQube IntelliJ 插件如何对新代码运行检查

java - @OneToMany 关系中 merge() 的奇怪行为

java - 如何从maven依赖的属性文件中获取位置?

objective-c - 复制NSMutableArray线程安全吗?

java - 函数参数错误 - JComboBox 中的 AutoComplete

linux - 如何将多个正在运行的 ping 线程反馈/结果保存到每个相关文件输出?

c++ - 如何在 MPI + openmp 中启动多线程?

java - 是否有执行死锁检测的 Lock 实现?