编程语言
首页 > 编程语言> > java – 调度程序可以挂起一个线程并执行另一个线程/工作吗?

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