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

时间:2018-04-07 16:00:03

标签: java multithreading

page 498 of Head First Java

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

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");
}}

每次运行此代码时,输​​出始终是“返回主要”,位于“堆栈顶部o”之上,这不是不可预测的,因为他们说,为什么?

2 个答案:

答案 0 :(得分:1)

对于最近的多核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

答案 1 :(得分:1)

这是不可预测的意味着即使您尝试了一百万次并发现代码以相同的顺序执行,当下次执行代码或在不同的环境中执行代码时,JVM仍然无法保证执行顺序。

使用更多线程模拟这种不可预测的行为可能更容易:

for (int i = 0; i < 1000; i++) {
    Runnable threadJob = new MyRunnable();
    Thread myThread = new Thread(threadJob);
    myThread.start();
    System.out.println("back in main");
}