gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:12:16 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com