簡體   English   中英

如何在Java中無限期地暫停一個線程然后恢復它?

[英]How to indefinitely pause a thread in Java and later resume it?

也許這個問題之前已被多次詢問過,但我從未找到過令人滿意的答案。

問題:


我必須使用循環策略來模擬進程調度程序。 我正在使用線程來模擬進程和多道程序設計; 一切正常,JVM管理線程。 但問題是,現在我想控制所有線程,這樣我就可以通過一定量(或時間)單獨運行每個線程,就像真正的OS進程調度程序一樣。

我在想做什么:

我希望有一個所有線程的列表,因為我迭代列表我想為每個線程執行相應的量程,但是一旦時間到了,我想無限期地暫停該線程,直到列表中的所有線程都被執行,然后我到達同一個線程再次恢復它,依此類推。

問題:

那么他們是一種方法,不使用棄用的方法stop(),suspend()或resume()來控制線程嗎?

就在這里:

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

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

    }
}

請注意,“工作”不應該阻止。

簡答:不。 您無法在Java中實現線程調度程序,因為它不能以足夠低的級別運行。

如果你真的打算實現一個進程調度程序,我希望你需要掛鈎底層的操作系統調用,因此我懷疑這在Java中是一個好主意(如果可能的話)。 至少,你將無法使用java.lang.Thread來表示正在運行的線程,所以它也可以用像C這樣的低級語言來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM