如何无限期地在Java中暂停一个线程然后恢复它?

也许这个问题以前曾被问过很多次,但我从未找到过令人满意的答案。

问题:

我必须使用循环策略来模拟进程调度程序。 我正在使用线程来模拟进程和多道程序设计; 一切正常,JVM管理线程。 但问题是,现在我想控制所有线程,这样我就可以通过一定量(或时间)单独运行每个线程,就像真正的OS进程调度程序一样。

我在想什么:

我希望有一个所有线程的列表,因为我迭代列表我想为每个线程执行相应的量程,但是一旦时间到了,我想无限期地暂停该线程,直到列表中的所有线程都被执行,然后我到达同一个线程再次恢复它,依此类推。

问题是:

那么他们是一种方法,不使用弃用的方法stop(),suspend()或resume()来控制线程吗?

谁说Java不够低?

这是我的3分钟解决方案。 我希望它符合您的需求。

import java.util.ArrayList; import java.util.List; public class ThreadScheduler { private List threadList = new ArrayList(); public ThreadScheduler(){ for (int i = 0 ; i < 100 ; i++){ threadList.add(new RoundRobinProcess()); new Thread(threadList.get(i)).start(); } } private class RoundRobinProcess implements Runnable{ private final Object lock = new Object(); private volatile boolean suspend = false , stopped = false; @Override public void run() { while(!stopped){ while (!suspend){ // do work } synchronized (lock){ try { lock.wait(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } } } public void suspend(){ suspend = true; } public void stop(){ suspend = true;stopped = true; synchronized (lock){ lock.notifyAll(); } } public void resume(){ suspend = false; synchronized (lock){ lock.notifyAll(); } } } } 

请注意,“工作”不应该阻止。

就在这里:

Object.wait(),Object.notify()和java.util.concurrent的一堆其他更好的同步原语。

简答:不。 您无法在Java中实现线程调度程序,因为它不能以足够低的级别运行。

如果你真的打算实现一个进程调度程序,我希望你需要挂钩底层的操作系统调用,因此我怀疑这在Java中是一个好主意(如果可能的话)。 至少,你将无法使用java.lang.Thread来表示正在运行的线程,所以它也可以用像C这样的低级语言来完成。