美文网首页java线程
线程lock-2 线程通信 Condition

线程lock-2 线程通信 Condition

作者: 传说中的大哥 | 来源:发表于2018-11-22 15:56 被阅读0次

Condition与Lock是绑定的,一个lock可以创建多个Condition,一个Condition可以管理多个线程,Condition唤醒线程是按顺序唤醒,而Synchronized wait是随机唤醒线程,看谁先抢到cpu资源谁被唤醒。

Condition声明:

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

例:两个线程 子线程和主线程 子线程打印一边,主线程打印两边 交替打印 循环5次

声明打印方法Demo2:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo2 {

    volatile boolean flag = false;
    Lock lock = new ReentrantLock();
    Condition condition = lock.newCondition();

    //子线程输出
    public  void sub()  {
            try {
                lock.lock();
                while (flag){
                    condition.await();
                }
                for(int i=0;i<1;i++){
                    System.out.println("我是子线程");
                }
                flag= true;
                condition.signal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
    }
    public synchronized void main()  {
        try {
            lock.lock();
            while (!flag){
                condition.await();
            }
            for(int i=0;i<2;i++){
                System.out.println("我是主线程");
            }
            flag= false;
            condition.signal();
        }catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}

main 函数类:

/**
 * 两个线程 子线程和主线程  子线程打印一边,主线程打印两边 交替打印
 */
public class Demo3 {
    public static void main(String[] args) throws InterruptedException {
        Demo2 d = new Demo2();
       new Thread(()->{
           for(int i =0;i<5;i++){
                   d.sub();
           }
       }).start();
        for(int i =0;i<5;i++){
                d.main();
        }
    }
}

运行结果:

Disconnected from the target VM, address: '127.0.0.1:60943', transport: 'socket'
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程
我是子线程
我是主线程
我是主线程

Process finished with exit code 0

相关文章

网友评论

    本文标题:线程lock-2 线程通信 Condition

    本文链接:https://www.haomeiwen.com/subject/apmlqqtx.html