Dado un (ArrayList), se reescribe en una cola de bloqueo sencillo

Dado un (ArrayList) para volver a escribir en una cola de bloqueo sencillo, los requisitos han puesto y obtener métodos, y el método getSize, capaz de soportar múltiples productores y consumidores múltiples llamadas roscas de congestión.

1] con una cerradura sincronizada o cerraduras para ReentrantLock

1] El uso de objetos de espera, notifique, para lograr notifyAll

La idea básica: los elementos se suman a los contenedores, utilice los elementos de método get Sacar del contenedor utilizando el método put para añadir un elemento al juez cuando se ponen a métodos de uso, si el contenedor está lleno, a continuación, llamar al método wait (), utilice los bloques Añadir el tema y esperar a que los elementos de rosca de los consumidores, con el fin de volver añadir elementos que componen el espacio contenedor, de la misma manera cuando se utiliza el método GET para obtener los elementos, si el recipiente ya está vacía, esta vez para llamar al método wait (), de manera que el hilo para bloquear los elementos, esperar la adición de hilos para añadir elementos al recipiente no se vacía a continuación, retirar el elemento del recipiente

público  de clase MyArrayBlockingQueue <T> {
     / * 
     * llamada al constructor sin argumentos, la longitud predeterminada de la cola de bloqueo 
     * / 
    pública  estática  final  int SIZE_VALUE = 10 ;
     / * 
     * cola de contenedor de cola elemento de almacenamiento 
     * / 
    públicas  final List <T> Listas = new new ArrayList <> ();
     / * 
     * la capacidad máxima de la cola 
     * / 
    privada  final  int la maxSize;
     / * 
     número actual de elementos en la cola * 
     * / 
    privada  int size = 0 ; 
    
    pública MyArrayBlockingQueue () {
         super ();
        la presente .maxSize = SIZE_VALUE; 
    } 

    / ** 
     * se puede establecer cuando el constructor con parámetros, crea un máximo elemento de la cola 
     * @ param elemento número maxSize máxima de la cola
      * / 
    público MyArrayBlockingQueue ( int maxSize) {
         el presente .maxSize = maxSize; 
    } 
    / * * 
     * el método se llama el productor hasta el recipiente cuando los elementos de inserto 
     * @param T de una cola entrante 
     * @throws excepción InterruptedException se tira hacia arriba el hilo interrupciones
      * / 
    público  el sincronizada  void PUT (T T) tiros InterruptedException {
         al mismo tiempo (Listas .size () == la maxSize) {
            System.out.println ( "el número de elementos de cola" + maxSize + "th, la cola en el estado de bloqueo" );
             el este .wait (); 
        } 
        lists.add (T);
         ++ tamaño; 
        System.out.println ( "producción de elementos en el número de elementos de tamaño:" + tamaño + "" );
         el este .notifyAll (); // despertador hilo consumo 
    }
     / ** 
     * método llamado cuando los consumidores toman elementos del contenedor 
     * / 
    público  el sincronizada T GET () { 
        T T = nulo ;
         el tiempo (lists.size () == 0 ) {
             el try {
                 el este .wait (); 
            }la captura (InterruptedException E) { 
                e.printStackTrace (); 
            } 
        } 
        T = lists.get (0 ); 
        lists.remove ( 0 );
         - tamaño; 
        System.out.println ( "el número de elementos en el recipiente con el tamaño de los consumidores:" + tamaño + "" );
         el este .notifyAll (); // wakeup producción hilo producción 
        de retorno T; 
    } 
    / ** 
     * número actual de elementos en la cola 
     * / 
    público  int getSize () {
         retorno tamaño; 
    } 
}

Resultados del ensayo:

 

 La primera prueba, que se encuentra fuera de los datos es 0, y más tarde tomó un vistazo, en el método get, olvide quitar el elemento remove perdido, lo que lleva a tomar los valores son 0, un poco descuidada;

Otro conjunto de cansancio, sino que también se puede convertir en una cola de bloqueo, puede intentar

 

Supongo que te gusta

Origin www.cnblogs.com/SpaceKiller/p/12536109.html
Recomendado
Clasificación