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

2022-09-02 10:44:04

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

问题:


我必须使用轮循机制策略模拟流程调度程序。我正在使用线程来模拟过程和进程并发;JVM管理线程一切正常。但问题是,现在我想控制所有线程,这样我就可以在一定的数量(或时间)内单独运行每个线程,就像真正的操作系统进程调度程序一样。

我想做什么:

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

问题:

那么,在不使用不推荐使用的方法stop(),suspend()或resum()的情况下,他们是否能够对线程进行这种控制?


答案 1

是的,有:

Object.wait( )、 Object.notify() 和 .java.util.concurrent


答案 2

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

    }
}

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