Подтвердить что ты не робот

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

Возможно, этот вопрос задавался много раз раньше, но я не нашел удовлетворительного ответа.

Проблема:


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

То, что я собираюсь сделать:

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

Вопрос:

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

4b9b3361

Ответ 1

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

    }
}

Обратите внимание, что "do work" не следует блокировать.

Ответ 2

Да, есть:

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

Ответ 3

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

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