【发布时间】:2020-09-15 21:59:13
【问题描述】:
当我第一次开始学习 Java 时,我了解到 代码 是从 top 到 bottom 读取的。无需编写代码来涵盖该解释,因为我想你们都明白了。
但是当我使用multi-threading 时会发生什么?假设我有这个简单的例子:
public class Tester {
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
executorService.execute(new WorkingClass());
}
System.out.println("rest od code..");
executorService.shutdown();
}
}
class WorkingClass implements Runnable{
@Override
public void run() {
System.out.println("working");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我正在使用 singleThreadExecutor,所以 1 个线程 应该完成这 5 个任务。我希望我的 for 循环 会首先运行,在 控制台 中打印 "rest od code.." 之前至少打印一个 "working"。我错了。我的结果总是这样:
rest od code..
working
working
working
working
working
谁能告诉我,在'rest of code' 之前的控制台 中至少有一个'working' 吗?是否有可能代码运行得如此之快以至于在到达('rest of code')之前没有机会实际运行任何run() method?
[注意] 任何修改都将有助于改进此问题。
【问题讨论】:
-
创建新实例的开销可能比当前线程慢
-
您应该多次运行此命令,看看是否有任何不同
-
@OneCricketeer 这正是我所期待的。我只是不想做出任何错误的假设,所以我不会学到错误的东西。是的,我多次运行它:)
-
仅供参考: “我了解到代码是从上到下阅读的。” -- 允许编译器重新排序语句,只要它不改变“单线程透视”和其他限制的结果。这不是你“问题”的原因;这是线程创建/调度开销。
-
在多线程中永远不要假设执行顺序。
标签: java multithreading java-threads