Foro sobre Java SE > Problemas con el uso compartido entre hilos de un List
Me parece un caso que se resuelve mediante el patrón de diseño Producer/Consumer.
No sé si es lo que estás implementando, o en caso de que sí lo estés, si tienes algún problema con tu código.
Tengo desarrolladas implementaciones específicas para Runnable y SwingWorker (modificado), por si te interesan.
¿Te suena algo como ésto?:
private static class RunnableServer implements Runnable {
private final transient BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
private final transient ReentrantLock lockServer = new ReentrantLock();
private final transient Condition pause = lockServer.newCondition();
private transient boolean isPaused;
private transient Future<?> currentTask;
private Runnable currentRunnable;
void addTask(final Runnable task) {
try {
queue.put(task);
} catch (InterruptedException ex) {
JPToolsLogService.getLogger().error(ex.getMessage(), ex);
}
}
void removeTask(final Runnable task) {
if (currentRunnable != null && currentRunnable.equals(task)) {
if (currentTask != null && !currentTask.isDone()) {
currentTask.cancel(true);
}
}
queue.remove(task);
}
void shutdown() {
final ReentrantLock localLock = lockServer;
localLock.lock();
try {
isPaused = false;
pause.signalAll();
} finally {
localLock.unlock();
}
if (currentTask != null && !currentTask.isDone()) {
currentTask.cancel(true);
}
queue.clear();
}
void pause(final boolean isPaused, final boolean cancelTask) {
this.isPaused = isPaused;
if (isPaused) {
if (cancelTask && currentTask != null && !currentTask.isDone()) {
currentTask.cancel(true);
}
} else {
final ReentrantLock localLock = lockServer;
localLock.lock();
try {
pause.signalAll();
} finally {
localLock.unlock();
}
}
}
@Override
public void run() {
final ThreadPoolExecutor pool = Lookup.getDefault().lookup(JPExecutor.class).getCachedThreadPoolService();
while (true) {
final ReentrantLock localLock = lockServer;
localLock.lock();
try {
while (isPaused) {
try {
pause.await();
} catch (InterruptedException ex) {
JPToolsLogService.getLogger().error(ex.getMessage(), ex);
}
}
} finally {
localLock.unlock();
}
try {
currentRunnable = queue.take();
currentTask = pool.submit(currentRunnable);
currentTask.get();
} catch (InterruptedException | ExecutionException ex) {
JPToolsLogService.getLogger().warn(ex.getMessage(), ex);
}
}
}
}

Hola, soy nuevo en el foro y de antemano les doy las gracias por el tiempo y las opiniones y consejos que me den.
Mi duda es la siguiente:
Estoy realizando un proyecto en el que la captura de datos es critica, osea que todo lo que pase por mi lo capturo y lo tengo tratar. Hasta aquí lo hago sin ningún problema lo que pasa que estos datos capturados deben ser almacenados en ficheros siguiendo una serie de parametros de solapamiento, es decir si mi captura para volcar a un fichero es de 10.000 el siguiente fichero compartirá con el los 100 últimos o el numero que se desee.
Para ello tengo un hilo encargado únicamente de la captura que es el encargado de pasarle la captura al hilo "Escuchador" en el que como buffer de almacenaje uso un List<Mi Objeto>, en este hilo "Escuchador" controlo el cumplimiento de el numero de datos previamente capturados y cuando se cumple mediante list.subList(inicio, tam) se lo paso a la instancia de un tercer hilo encargado de su volcado a un fichero, y en el hilo escuchador elimino los datos mediante un list.remove(inicio, tam) de esta forma el buffer no me crecería descontroladamente.
Lo que me pasa es que como desde el capturador realizo llamadas constantes al escuchador el acceso a la lista es tan constante que no puedo gestionar el envio de sublistas para el volcado a fichero.
Un saludo y muchas gracias.