import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; public class Res {
public String userSex;
public String userName;
public boolean flag = false;
Lock lock = new ReentrantLock();
}

import java.util.concurrent.locks.Condition; public class IntTread extends Thread{
private Res res;
Condition condition; public IntTread(Res res, Condition condition) {
this.res = res;
this.condition = condition;
} @Override
public void run() {
int count = 0;
while (true){
try {
res.lock.lock();
if (res.flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (count==0){
res.userName = "男zs";
res.userSex = "男";
}else {
res.userName = "女xh";
res.userSex = "女";
}
count = (count + 1)%2;
res.flag = true;
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
res.lock.unlock();
}
}
}
}

import java.util.concurrent.locks.Condition; public class OutThread extends Thread {
private Res res;
private Condition condition; public OutThread(Res res, Condition condition) {
this.res = res;
this.condition = condition;
} @Override
public void run() {
while (true){
try {
res.lock.lock();
if (!res.flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(res.userName + "--" + res.userSex);
res.flag = false;
condition.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
res.lock.unlock();
}
}
}
}

import java.util.concurrent.locks.Condition; /**
* Condition的功能类似于在传统的线程技术中的,Object.wait()和Object.notify()的功能
* condition await() signal()
*/
public class Main {
public static void main(String[] args){
Res res = new Res();
Condition condition = res.lock.newCondition();
IntTread intTread = new IntTread(res,condition);
OutThread outThread = new OutThread(res,condition);
intTread.start();
outThread.start();
}
}

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* 与重入锁相关联的Condition
* 和Object.wait(),notify()方法一样,当 线程使用Condition.await()时,要求线程持有相关的重入锁,
* 在Condition.await()调用后,这个线程会释放这把锁。同理,在condition.signal()方法调用时,也要求
* 线程先获得相关的锁,在condition.signal()方法调用后,系统会从当前Condition对象的等待队列中唤醒一个线程,
* 一旦线程被唤醒,它会重新尝试获得与之绑定的重入锁,一旦成功获取,就可以继续执行了。因此,在signal()方法调用之后,
* 一般需要释放相关的锁,让给被唤醒的线程,让它继续执行。
*/
public class ConditionDemo implements Runnable{
public static ReentrantLock lock = new ReentrantLock();
public static Condition condition = lock.newCondition();
@Override
public void run() {
try {
lock.lock();
condition.await();//使当前线程等待,同时释放当前锁
System.out.println("Thread is going on");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException{
ConditionDemo t = new ConditionDemo();
Thread t1 = new Thread(t);
t1.start();
Thread.sleep(2000);
//通知线程t1继续执行
lock.lock();//调用signal()的方法时,线程要先获得相关的锁
condition.signal();//唤醒一个在等待中的线程
lock.unlock();//signal()调用后释放相关的锁给被唤醒的线程
}
}

最新文章

  1. [No000069]Javascript中this关键字详解
  2. 两个div叠加触发事件发生闪烁问题
  3. 自定义SharePoint 2013 元数据选择控件
  4. iOS:核心动画具体的类和协议的介绍
  5. C# ACM poj1002
  6. hibernate篇章六--demo(Hibernate之第1解之-hibernate_demo_1)
  7. Lucene入门的基本知识(四)
  8. Xamarin Studio –Project not built in active configuration
  9. android学习4——View的长宽问题
  10. IO流中的Stream相关对象
  11. angular指令监听ng-repeat渲染完成后执行自定义事件方法
  12. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)
  13. Axure RP 8 软件介绍
  14. 使用python操作XML增删改查
  15. selenium RC 环境配置
  16. 常见的CSS代码无效问题
  17. http 文件传输
  18. CSS3 Flex布局整理(一)
  19. smartgit 需要输入序列号解决办法
  20. Kali Linux下常用软件安装及配置

热门文章

  1. 使用ant编译Android APK
  2. 学习日记10、easyui编辑器combobox绑定数据的两种方式
  3. 去掉xcode中警告的一些经验
  4. ruby file
  5. 【CDN+】 Kylin 的初步认识与理解
  6. 【MM系列】SAP ABAP 在选择画面显示输出结果
  7. Convolutional Neural Networks(1): Architecture
  8. 基于Apache搭建HTTP HTTPS
  9. Vulhub搭建
  10. jQuery基础--创建节点和 添加节点