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 (); } } }