¿Cómo detener el hilo productor si hilo consumidor se enfrenta a una excepción

ayush:

tengo esta situación consumidor productor donde estoy usando arrayblockingqueue. ¿Cómo detener el hilo productor si hilo consumidor se enfrenta a una excepción. Necesito productor a dejar de esperar cola para estar vacío. i han inducido una excepción de tiempo de ejecución forzada. Pero el programa no sale. Los productores seguir esperando fr la cola para estar vacío. Puede ayudarme alguien, por favor

public class ServiceClass implements Runnable{

    private final static BlockingQueue<Integer> processQueue = new ArrayBlockingQueue<>(10);
    private static final int CONSUMER_COUNT = 1;
    private boolean isConsumerInterrupted = false;

    private boolean isConsumer = false;
    private static boolean producerIsDone = false;

    public ServiceClass(boolean consumer,boolean isConsumerInterrupted) {
        this.isConsumer = consumer;
        this.isConsumerInterrupted = isConsumerInterrupted;
    }

    public static void main(String[] args) {

        long startTime = System.nanoTime();

        ExecutorService producerPool = Executors.newFixedThreadPool(1);
        producerPool.submit(new ServiceClass(false,false)); // run method is
                                                         // called   
        // create a pool of consumer threads to parse the lines read
        ExecutorService consumerPool = Executors.newFixedThreadPool(CONSUMER_COUNT);
        for (int i = 0; i < CONSUMER_COUNT; i++) {
            consumerPool.submit(new ServiceClass(true,false)); // run method is
                                                            // called
        }
        producerPool.shutdown();
        consumerPool.shutdown();

        while (!producerPool.isTerminated() && !consumerPool.isTerminated()) {
        }

        long endTime = System.nanoTime();
        long elapsedTimeInMillis = TimeUnit.MILLISECONDS.convert((endTime - startTime), TimeUnit.NANOSECONDS);
        System.out.println("Total elapsed time: " + elapsedTimeInMillis + " ms");

    }



    @Override
    public void run() {
        if (isConsumer) {
            consume();
        } else {
            readFile(); //produce data by reading a file
        }
    }

    private void readFile() {
        //Path file = Paths.get("c:/temp/my-large-file.csv");
        try
        {

            for(int i =0;i<10000;i++) {
                if(isConsumerInterrupted) {
                    break;
                }
                processQueue.put(i);
                System.out.println("produced:" + i+"------"+processQueue.size());

            }
            //Java 8: Stream class


        } catch (Exception e){
            e.printStackTrace();
        }

        producerIsDone = true; // signal consumer
        System.out.println(Thread.currentThread().getName() + " producer is done");
    }

    private void consume() {
        try {
            while (!producerIsDone || (producerIsDone && !processQueue.isEmpty())) {

                System.out.println("consumed:" + processQueue.take()+"------"+processQueue.size());
                throw new RuntimeException();

                //System.out.println(Thread.currentThread().getName() + ":: consumer count:" + linesReadQueue.size());                
            }
            System.out.println(Thread.currentThread().getName() + " consumer is done");
        } catch (Exception e) {
            isConsumerInterrupted=true;
        }


    }




}
Ravindra Ranwala:

Está utilizando una bandera isConsumerInterruptedde interrumpir el hilo Productor. Esto está mal. El consumidor no consume elementos de la cola, y el productor sigue produciendo hasta que la cola está llena y luego se inicia el bloqueo hasta que la cola se vuelve no rotundo. Luego, cuando el consumidor lanza una RuntimeException que establece el indicador, y el hilo productor obtiene ninguna posibilidad de comprobar la bandera, ya que ninguno de los consumidores consumen los elementos de la cola para que el productor pueda emerger desde el estado de espera. Una opción es utilizar un futuro y cancelarla cuando los consumidores se produce una excepción contraria al establecimiento del indicador. Dado que el processQueue.putes sensible a la interrupción, se dará por terminado el hilo productor de éxito. Una InterruptedExceptiones thrown- si interrumpe mientras espera. Así es como se ve.

private static Future<?> producerFuture = null;
public static void main(String[] args) {

    // Remainder omitted.
    producerFuture = producerPool.submit(new ServiceClass(false, false)); 
    // ...
}

private void consume() {
    try {
        // ...
    } catch (Exception e) {
        producerFuture.cancel(true);
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333499&siteId=1
Recomendado
Clasificación