让我们有以下代码(我们将在单核 CPU 上运行它):
Runnable runnable1 = new Runnable() {
@Override
public void run() {
System.out.println("runnable_1_1");
System.out.println("runnable_1_2");
}
};
Runnable runnable2 = new Runnable() {
@Override
public void run() {
System.out.println("runnable_2_1");
System.out.println("runnable_2_2");
}
};
ExecutorService executorService = Executors.newSingleThreadExecutor(); // or Executors.newCachedThreadExecutor();
executorService.execute(runnable1);
executorService.execute(runnable2);
executorService.shutdown();
理论上是否有可能将一项任务嵌入到另一项任务中,我们会看到这样的输出:
runnable_1_1
runnable_2_1
runnable_2_2
runnable_1_2
附言
单线程执行器对于这个例子不是强制性的。强制要求我们只有一个 CPU 内核
最佳答案
对于任意线程,这不能在 Java 级别上干净地完成,因为没有非 deprecated methods暂停它。所有有效的控制方法都包括线程主动屈服。
然而,操作系统本身通常有一个调度程序,它会定期挂起和恢复所有正在运行的进程,从而允许拥有比可用 CPU 内核数量更多的进程。另外,Java 虚拟机通常不会只作为一个进程运行(green threads 属于过去),每个线程一个进程。
因此,操作系统可能会暂时挂起一个线程,允许运行另一个线程或 Java 虚拟机之外的其他进程。一般的答案可能是肯定的。
关于java - 调度程序可以挂起一个线程并执行另一个线程/工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42531716/