java线程学习之Condition

来源:互联网 发布:贪心算法实例 编辑:程序博客网 时间:2024/05/19 18:48
package learn.thread;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/*Condition,和ReentrantLock配合使用提供唤醒线程和暂停线程功能 */public class Demo14 {    static Lock lock = new ReentrantLock();    static int count = 0;    static Condition condition = lock.newCondition();// 必须配合lock.lock();lock.unlock();使用    public static void main(String[] args) {        Thread t1 = new Thread() {            @Override            public void run() {                lock.lock();                if (count < 5) {                    System.out.println("线程1未达到业务要求,暂停中,等待线程2处理到达到要求后唤醒");                    try {                        condition.await();// 暂停线程并释放锁                        System.out.println("我是线程1后面的代码");                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }                lock.unlock();            }        };        Thread t2 = new Thread() {            @Override            public void run() {                lock.lock();                while (count < 10) {                    count++;                    System.out.println("线程2业务处理中: " + count);                    try {                        Thread.sleep(1000);                        if (count == 5) {                            condition.signal();                            System.out.println("唤醒线程1");                             lock.unlock();//调用signal()方法后,线程2并不会释放锁,需要手动释放线程2才会执行                        }                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }//              lock.unlock();// 这里释放锁,线程2执行完,线程1才会执行            }        };        t1.start();        t2.start();    }}// 线程1未达到业务要求,暂停中,等待线程2处理到达到要求后唤醒// 线程2业务处理中: 1// 线程2业务处理中: 2// 线程2业务处理中: 3// 线程2业务处理中: 4// 线程2业务处理中: 5// 唤醒线程1// 我是线程1后面的代码// 线程2业务处理中: 6// 线程2业务处理中: 7// 线程2业务处理中: 8// 线程2业务处理中: 9// 线程2业务处理中: 10
原创粉丝点击