[英]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.