Condición de Java

Java tiene dos mecanismos para el bloqueo y las discusiones estela

En primer lugar, para lograr por objeto de espera y notificar combina con la palabra clave sincronizada

Dos colecciones, Condición Lock

En este artículo se describe la segunda

atributo de la condición

  • Objeto de espera y notificar mecanismo similar, pero diferente en que, Condición es necesario asociar a bloquear objetos creado por objeto newCondition bloqueo ()
  • Finamente controlar el multi-hilo, con una cerradura, puede crear múltiples Condición

    Por ejemplo: un multiproceso leer / escribir un búfer de pila, productor modelo de consumo, que el hilo puede ser claramente despertado por Condición

ejemplo

Paquete com.darchrow.test.condition; 

Importación java.util.LinkedList; 
Importación java.util.List; 
Importación java.util.concurrent.CountDownLatch; 
Importación java.util.concurrent.ExecutorService; 
java.util.concurrent.Executors de importación; 
java.util.concurrent.locks.Condition importación; 
importación java.util.concurrent.locks.Lock; 
importación java.util.concurrent.locks.ReentrantLock; 

/ * * 
 * Ejemplos: 
 método * Add (): cuando la longitud de conjunto 10:00, se suspende el subproceso actual, de modo que otros hilos van primero. De lo contrario se añadirá un mensaje, y elevarla realiza sub () hilo 
 * sub (): Cuando la longitud es 0, la operación de manera similar 
 * 
 * @author MDL 
 * @date 03/25/2020 10:08 
 * / 
público  clase los implementos de la Runnable {ConditionDemo 

    privada finalesestática de bloqueo de bloqueo = nueva ReentrantLock (); 

    privada última estática Condición addCondition = bloqueo .newCondition (); 

    privada última estática Condición subcondición = bloqueo .newCondition (); 


    privada  estática  int num = 0 ; 

    privada  estática List <String> list = nueva LinkedList <> (); 

    privada bandera booleana; 

    privada countDwonLatch CountDownLatch; 

    pública ConditionDemo (bandera booleana, CountDownLatch countDwonLatch) {
        la presente .flag = En la bandera,
         la presente .countDwonLatch = countDwonLatch; 
    } 

    privada  sin efecto el Add () {
         Lock . Lock ();
         el try {
             SI (list.size () == 10 ) {
                 // set está llena, no se pueden combinar, y menos tiempo de espera 
                del addCondition. la await (); 
            } 
            // no está lleno, puede seguir añadiendo elementos 
            NUM ++ ; 
            list.add ( " la opción agregar plátano " + NUM); 
            . Sistema OUT .println (" Hilo actual: " . + Thread.currentThread () getName () + "se añadió al elemento de colección, la longitud actual de la " + list.size ());
             // añadir terminado, puede reducir la 
            subCondition.signal (); 
            countDwonLatch .countDown (); 
            . el Sistema OUT .println ( " thread actual: " . Thread.currentThread + () getName () + " countDownLatch.getCount () = " + countDwonLatch.getCount ()); 
        } la captura (Excepción E) { 
            e.printStackTrace (); 
        } finally {
             Lock.unlock (); 
        } 

    } 

    privada  vacío Sub () {
         Lock . Lock ();
         el try {
             SI (list.size () == 0 ) {
                 // establecer el vacío, el bloqueo, irreductible, a la espera de 
                subcondición. la Await (); 
            } 
            // tiene los datos, se puede reducir 
            num-- ; 
            cadena STR . = Lista GET ( 0 ); 
            list.remove ( 0 ); 
            el Sistema. OUT .println ( " thread actual:"Thread.currentThread + () getName () + " , Guardar el elemento de colección, " + STR + " , reduciendo la longitud de la " + list.size ());
             // Guardar terminado, puede seguir aumentando la 
            addCondition.signal () ; 
            countDwonLatch.countDown (); 
            el Sistema. OUT .println ( " thread actual: " . Thread.currentThread + () getName () + " countDownLatch.getCount () = " + countDwonLatch.getCount ()); 
        } la captura (Excepción E ) { 
            e.printStackTrace (); 
        } la finalmente {
            bloquear .unlock (); 
        } 


    } 


    Pública  estáticas  void main (String [] args) throws InterruptedException { 
        CountDownLatch countDwonLatch = nueva CountDownLatch ( 40 ); 
        ConditionDemo ConditionDemo1 = nuevo ConditionDemo ( verdadero , countDwonLatch); 
        ConditionDemo ConditionDemo2 = nuevo ConditionDemo ( falso , countDwonLatch); 
        ExecutorService executorService1 = Executors.newFixedThreadPool ( 10 ); 
        ExecutorService executorService2= Executors.newFixedThreadPool ( 10 ); 

        para ( int i = 0 ; i < 20 ; i ++ ) { 
            executorService1.execute (ConditionDemo1); 
            executorService2.execute (ConditionDemo2); 
        } 
        CountDwonLatch. await (); 
        executorService1.shutdown (); 
        executorService2.shutdown (); 

        Sistema. fuera .println ( " 最终集合元素个数: " + list.size ()); 

//         Thread t1 = new Thread (ConditionDemo1);
//         Thread t2 = new Thread (ConditionDemo1);
//         Thread t3 = new Thread (ConditionDemo1);
//         Thread t4 = new Thread (ConditionDemo1);
//         Thread t5 = new Thread (ConditionDemo1);
// 
//         t6 Tema = new Thread (ConditionDemo2);
//         Thread t7 = new Thread (ConditionDemo2);
//         Thread t8 = new Thread (ConditionDemo2);
//         Thread t9 = new Thread (ConditionDemo2);
// 
//         t1.start ();
//         t2.start ();
//         t3.start ();
//         t4.start ();
//         t5.start ();
//         t6.start ();
//         t7.start ();
//         t8.start ();
//         t9.start (); 

    } 

    @ Override 
    pública  vacío run () {
         si (flag) { 
            add (); 
        } Más { 
            sub (); 
        } 

    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/bloodthirsty/p/12566669.html
Recomendado
Clasificación