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

时间:2010-04-12 14:29:52

标签: java multithreading

以前可能已经多次询问过这个问题,但我从未找到过令人满意的答案。

问题:


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

我在想做什么:

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

问题:

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

3 个答案:

答案 0 :(得分:9)

是的,有:

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

答案 1 :(得分:6)

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

    }
}

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

答案 2 :(得分:0)

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

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