如何无限期地暂停Java中的线程并稍后恢复它?


问题内容

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

问题:

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

我在想做什么:

我想要一个所有线程的列表,当我迭代该列表时,我想为它们对应的量子执行每个线程,但是随着时间的流逝,我想无限期地暂停该线程,直到执行列表中的所有线程,然后再执行到达同一线程再次恢复它,依此类推。

问题:

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


问题答案:

谁说Java不够低级?

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

import java.util.ArrayList;
import java.util.List;

public class ThreadScheduler {

    private List<RoundRobinProcess> threadList
            = new ArrayList<RoundRobinProcess>();

    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();
            }
        }

    }
}

请注意,“执行工作”不应被阻止。