Возможно, этот вопрос задавали много раз прежде, но я никогда не находил удовлетворяющий ответ.
Я должен моделировать планировщик процесса, с помощью круговой стратегии. Я использую потоки для моделирования процессов и мультипрограммирования; все хорошо работает с JVM, управляющей потоками. Но вещь состоит в том, что теперь я хочу иметь контроль над всеми потоками так, чтобы я мог выполнить один только каждый поток определенным квантом (или время), точно так же, как реальная ОС обрабатывает планировщики.
Я хочу, имеют список всех потоков, поскольку я выполняю итерации списка, я хочу выполнить каждый поток для их соответствующего кванта, но как скоро время я хочу приостановить тот поток неограниченно долго, пока все потоки в списке не выполняются и затем когда я достигаю, тот же поток снова возобновляют его и так далее.
Так их путь, не используя остановку устаревших методов (), приостановите (), или резюме (), чтобы иметь этот контроль над потоками?
Кто сказал, что 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.
Да, есть:
Object.wait( ), Object.notify() и куча других гораздо более приятных примитивов синхронизации в java.util.concurrent
.