JUC 三 线程间通讯

  1. 多线程编程模板下:  判断    干活    通知      判断为了防止虚假唤醒,  此处的判断必须用while进行判断而不能用if进行判断,,,if判断为何会用虚假唤醒,能够仔细考虑清楚java

  2. JUC的线程间通讯:编程

    1. 使用:多线程

      1. 使用建立好的lock对象建立一个condition对象,Contidion condition = lock.newCondition()。spa

    2. 经常使用方法:线程

      1. condition.await()    等待对象

      2. condition.singnalAll()通知it

  3. demoio

package my.test;模板

 

import java.util.concurrent.locks.Condition;class

import java.util.concurrent.locks.ReentrantLock;

 

/**

*

* 线程间通讯

* @author Liang Wenjie

* @version 1.00

* @time 2019/8/26 0026 下午 10:40

*/

public class ConditionTest {

 

    public static void main(String[] args) {

 

        MyConditon myConditon = new MyConditon();

 

        for (int i=0; i<=10 ; i++) {

            new Thread(()->{

                myConditon.Method();

            },"AA").start();

        }

 

        for (int i=0; i<=10 ; i++) {

            new Thread(()->{

                myConditon.Method1();

            },"BB").start();

        }

    }

}

 

 

/**

* 判断 干活 通知

*/

class MyConditon{

 

    int i = 0;

 

    ReentrantLock lock = new ReentrantLock();

    Condition cd = lock.newCondition();

 

    public void Method(){

        lock.lock();

        try {

            //判断

            while (i != 0){

                cd.await();

            }

 

            //干活

            ++i;

            System.out.println("进行加法运算" + i );

 

            //通知

            cd.signalAll();

 

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

 

    public void Method1(){

 

        lock.lock();

        try {

            //判断

            while (i != 1) {

                cd.await();

            }

            //干活

            --i;

            System.out.println("进行减法运算" + i );

            //通知

            cd.signalAll();

        } catch (InterruptedException e) {

            e.printStackTrace();

        } finally {

            lock.unlock();

        }

    }

}