Как приостановить предварительно реализованный класс 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);
это будет продолжать проверять значение, пока оно не станет ложным.