java - 调度程序可以挂起一个线程并执行另一个线程/工作吗?

标签 java multithreading swing concurrency java-memory-model

让我们有以下代码(我们将在单核 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/

相关文章:

c++ - 在 arm 上使用 openMP 进行矩阵 vector 乘法

java - 尝试创建多个 JLabel,但只出现一个

Java JPanel 子类忽略添加组件的界限

java - 在 JFrame 中传递组件列表的 ActionListener

java - 为什么不显示附加了按下的键字符的 String 对象?

java - 应该打印数组的所有值的方法仅返回空值。

java - 在 2 个不同的线程中写入和读取 ArrayList

wpf - INotifyPropertyChanged、ObservableCollection、线程和 MVVM

java - 登录时 ~/bash_profile 中的 $JAVA_HOME 路径来源不正确

java - 如何在 Java 中比较字符串?