java – 调度程序可以挂起一个线程并执行另一个线程/工作吗?
作者:互联网
让我们有以下代码(我们将在单核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-memory-model,java,multithreading,concurrency,swing 来源: https://codeday.me/bug/20190823/1701167.html