首先我不知道他们为什么把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/