Java多线程并发编程-Condition_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java多线程并发编程-Condition

Java多线程并发编程-Condition

 2013/8/20 0:33:20  qi20088  程序员俱乐部  我要评论(0)
  • 摘要:Condition(条件变量)将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待set(wait-set)。其中,Lock替代了synchronized方法和语句的使用,Condition替代了Object监视器方法的使用。在condition中用到的是await()和singalCondition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例
  • 标签:多线程 Java 编程 线程
Condition(条件变量) 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

在condition中 用到的是 await() 和 singal

Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,请使用其 newCondition() 方法。

用 condition 实现三个线程的 交替执行!!!


public class ThreeThreadRunApp {
private static Lock lock = new ReentrantLock();

private static Condition condition1 = lock.newCondition();
private static Condition condition2 = lock.newCondition();
private static Condition condition3 = lock.newCondition();

private static Integer flag = 1;

public static void main(String[] args) throws Exception {

//老二执行
new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
while (true) {
while (flag != 2) {// 不是2号 执行
try {
condition2.await();// 则使自己等待
} catch (Exception e) {
e.printStackTrace();
}
}
// 执行 老二代码
for (int i = 0; i < 10; i++) {
System.out.println("---------老二执行   : " + i);
TimeUnit.MILLISECONDS.sleep(500);
}
// 执行完 通知老三执行
condition3.signal();
flag = 3;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}

}
}).start();

// 老三线程
new Thread(new Runnable() {
@Override
public void run() {
lock.lock();
try {
while (true) {
while (flag != 3) {// 不是3号 执行
try {
condition3.await();// 则使自己等待

} catch (Exception e) {
e.printStackTrace();
}
}
// 执行 老3代码
for (int i = 0; i < 10; i++) {
System.out.println("---------------------老三执行   : "+ i);
TimeUnit.MILLISECONDS.sleep(500);
}
// 执行完 通知老大执行
condition1.signal();
flag = 1;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}

}
}).start();

//老大执行
/**
* 这段代码  即老大执行的这段程序必须放在  thread1 thread2 的后面
*   因为在老大的代码中  有condition2.signal(); 
*   若是放在thread1前面的话  程序必不会执行 condition2.await();
*   所以会报错!
*/
lock.lock();
try {
while (true) {
while (flag != 1) {// 不是1号 执行
try {
condition1.await();// 则使自己等待
} catch (Exception e) {
e.printStackTrace();
}
}
// 执行 老大代码
for (int i = 0; i < 10; i++) {
System.out.println("-老大执行   : " + i);
TimeUnit.MILLISECONDS.sleep(500);
}
// 执行完 通知老二执行
flag = 2;
condition2.signal();
}

} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
发表评论
用户名: 匿名