Как неограниченно долго приостановить поток в Java и более позднем резюме это?

Возможно, этот вопрос задавали много раз прежде, но я никогда не находил удовлетворяющий ответ.

Проблема:


Я должен моделировать планировщик процесса, с помощью круговой стратегии. Я использую потоки для моделирования процессов и мультипрограммирования; все хорошо работает с JVM, управляющей потоками. Но вещь состоит в том, что теперь я хочу иметь контроль над всеми потоками так, чтобы я мог выполнить один только каждый поток определенным квантом (или время), точно так же, как реальная ОС обрабатывает планировщики.

Что я думаю, чтобы сделать:

Я хочу, имеют список всех потоков, поскольку я выполняю итерации списка, я хочу выполнить каждый поток для их соответствующего кванта, но как скоро время я хочу приостановить тот поток неограниченно долго, пока все потоки в списке не выполняются и затем когда я достигаю, тот же поток снова возобновляют его и так далее.

Вопрос:

Так их путь, не используя остановку устаревших методов (), приостановите (), или резюме (), чтобы иметь этот контроль над потоками?

20
задан meteorfox 12 April 2010 в 14:29
поделиться

3 ответа

Кто сказал, что 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();
            }
        }

    }
}

Обратите внимание, что «делать работу» не должно блокировать.

6
ответ дан 30 November 2019 в 01:23
поделиться

Короткий ответ: нет. Вы не сможете реализовать планировщик потоков в Java, поскольку он не работает на достаточно низком уровне.

Если вы действительно собираетесь реализовать планировщик процессов, я ожидаю, что вам придется подключиться к вызовам базовой операционной системы, и поэтому я сомневаюсь, что это когда-либо будет хорошей идеей (если это вообще возможно) в Java. По крайней мере, вы не сможете использовать java.lang.Thread для представления запущенных потоков, так что все это может быть сделано на языке более низкого уровня, например, C.

0
ответ дан 30 November 2019 в 01:23
поделиться

Да, есть:

Object.wait( ), Object.notify() и куча других гораздо более приятных примитивов синхронизации в java.util.concurrent.

9
ответ дан 30 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: