resueltos - reiniciar un hilo en java
¿Cómo pausar indefinidamente un hilo en Java y luego reanudarlo? (3)
¿Quién dijo que Java no es lo suficientemente bajo?
Aquí está mi solución de 3 minutos. Espero que se ajuste a sus necesidades.
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();
}
}
}
}
Tenga en cuenta que "trabajar" no debe estar bloqueando.
Tal vez esta pregunta se haya hecho muchas veces antes, pero nunca encontré una respuesta satisfactoria.
El problema:
Tengo que simular un programador de procesos, utilizando la estrategia round robin. Estoy usando hilos para simular procesos y multiprogramación; todo funciona bien con la JVM gestionando los hilos. Pero la cosa es que ahora quiero tener el control de todos los subprocesos para poder ejecutar cada subproceso solo por un determinado cuanto (o tiempo), al igual que los programadores de procesos del sistema operativo real.
Lo que estoy pensando hacer:
Quiero tener una lista de todos los subprocesos, ya que itero la lista. Quiero ejecutar cada subproceso para su cantidad correspondiente, pero tan pronto como termine el tiempo quiero pausar ese subproceso indefinidamente hasta que se ejecuten todos los subprocesos de la lista y luego, alcanzar el mismo hilo de nuevo reanudarlo y así sucesivamente.
La pregunta:
Entonces, ¿es una forma, sin utilizar métodos obsoletos, stop (), suspend () o resume (), para tener este control sobre los hilos?
Respuesta corta: no. No puede implementar un programador de subprocesos en Java, ya que no funciona a un nivel suficientemente bajo.
Si realmente tiene la intención de implementar un programador de procesos, esperaría que tuviera que conectarse a las llamadas al sistema operativo subyacente, y como tal, dudo que esto sea una buena idea (si es posible de forma remota) en Java. Como mínimo, no podría usar java.lang.Thread
para representar los subprocesos en ejecución, por lo que también se puede hacer en un lenguaje de nivel inferior como C.
Sí hay:
Object.wait (), Object.notify () y un montón de otras primitivas de sincronización mucho mejores en java.util.concurrent
.