Как приостановить предварительно реализованный класс Runnable в Java?

У меня есть следующее animator класс, который реализует Runnable (упомянутый в документации JUNG).

Как можно рассказать thread если какое-то условие было выполнено pause в течение некоторого времени, а затем start Бег?

    switch (args[0]) 
    {
        case "agent":
            int size=nodeAttributes.size();
            int i;
            for(i=0;i<size;i++)
            {
                if(args[1].equals(nodeAttributes.get(i).nodeName))
                {
                    VertexCollider vtxCol = new VertexCollider(layout, panel,args[1], args[2] , args[1] , nodeAttributes.get(i));
                    vtxCol.setMaximumIterations(1000);
                    vtxCol.setDesiredPrecision(1);
                    vtxCol.initialize();
                    Animator  animator = new Animator(vtxCol);

                    animator.start();
                    if(nodeAttributes.get(i).isMoving)
                    {
                        animator.stop();
                        animator.wait(10000);
                        System.out.println("stopped");
                    }
                    nodeAttributes.get(i).isMoving = true;
                    break;  
                }
            }
            break;
    }

3 ответа

Решение

Если вы хотите приостановить animator Вы должны сначала переместить animator объект и vtxCol Инициализация объекта в другой поток. Потому что даже если Thread.sleep() функция или wait() функция будет работать для вашей цели, они остановят функцию animator тоже, который может не соответствовать вашим потребностям.

После перемещения animator создание объекта в другой отдельный поток, вы должны рассмотреть возможность создания некоторых LinkedList, Array или какой-то Collection для хранения ваших данных движения для того, чтобы инициализировать vtxCol а также animator возразить им, и передать данные в поток. Тогда в Thread.sleep() Функция может ответить на ваши потребности в этом отдельном созданном потоке.

Согласно документации, на которую вы ссылаетесь, Animator может быть приостановлено на определенное время между циклами итерации.

animator.setSleepTime(10000);

И тогда вы могли бы установить время сна на гораздо более короткий интервал, когда ваше состояние паузы закончилось.

Однако кажется, что вы хотите, чтобы ваш Animator полностью останавливался, когда условие паузы выполняется. В этом случае я рекомендую вам stop() аниматор в то время (как делает ваш код), а затем start() это снова, когда условие паузы заканчивается. Похоже, вы можете повторно вызывать методы stop и start.

Поместите туда, где вы хотите, чтобы программа спала: (внутри оператора if?)

try {
    Thread.sleep(1);
} catch (InterruptedException e) {
    e.printStackTrace();
}

это заставит поток спать, сколько бы миллисекунд вы не захотели.

в то время как:

do{

    try {
        Thread.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}while(something() == true);

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

Другие вопросы по тегам