多线程编程10----condition同步工具类的使用
2014-09-01 16:12
381 查看
package zhu.suo;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
* 要求:1,2,3兄弟,1循环5次,2循环10次,3循环15次,接着1循环5次。。。。依次交替10次
* 提示:
* 使用1对2的condition,2对3的condition,3对1的condition
* */
public class ConditionThreeThreadLoop {
public static void main(String[] args) {
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p1(i);}
}
}
).start();
//2
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p2(i);}
}
}
).start();
//3
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p3(i);}
}
}
).start();
}
static class Demo{
private static int flag=1;
private static Lock lock = new ReentrantLock();
static Condition condition1 = lock.newCondition();
static Condition condition2 = lock.newCondition();
static Condition condition3 = lock.newCondition();
static void p1(int i)
{
lock.lock();
try{
while(flag!=1)
{
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<6;j++)
{System.out.println("老大 loop"+j+",外层:"+i);}
flag=2;
condition2.signal();//老大昨完 唤醒老二
}finally{
lock.unlock();
}
}
static void p2(int i)
{
lock.lock();
try{
while(flag!=2)
{
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<11;j++)
{System.out.println("老二 loop"+j+",外层:"+i);}
flag=3;
condition3.signal();//唤醒老三
}finally{
lock.unlock();
}
}
static void p3(int i)
{
lock.lock();
try{
while(flag!=3)
{
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<16;j++)
{System.out.println("老三 loop"+j+",外层:"+i);}
flag=1;
condition1.signal();//唤醒老大
}finally{
lock.unlock();
}
}
}
}
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/*
* 要求:1,2,3兄弟,1循环5次,2循环10次,3循环15次,接着1循环5次。。。。依次交替10次
* 提示:
* 使用1对2的condition,2对3的condition,3对1的condition
* */
public class ConditionThreeThreadLoop {
public static void main(String[] args) {
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p1(i);}
}
}
).start();
//2
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p2(i);}
}
}
).start();
//3
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10;i++)
{Demo.p3(i);}
}
}
).start();
}
static class Demo{
private static int flag=1;
private static Lock lock = new ReentrantLock();
static Condition condition1 = lock.newCondition();
static Condition condition2 = lock.newCondition();
static Condition condition3 = lock.newCondition();
static void p1(int i)
{
lock.lock();
try{
while(flag!=1)
{
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<6;j++)
{System.out.println("老大 loop"+j+",外层:"+i);}
flag=2;
condition2.signal();//老大昨完 唤醒老二
}finally{
lock.unlock();
}
}
static void p2(int i)
{
lock.lock();
try{
while(flag!=2)
{
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<11;j++)
{System.out.println("老二 loop"+j+",外层:"+i);}
flag=3;
condition3.signal();//唤醒老三
}finally{
lock.unlock();
}
}
static void p3(int i)
{
lock.lock();
try{
while(flag!=3)
{
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=1;j<16;j++)
{System.out.println("老三 loop"+j+",外层:"+i);}
flag=1;
condition1.signal();//唤醒老大
}finally{
lock.unlock();
}
}
}
}
相关文章推荐
- Java多线程编程--(10)学习Java5.0 并发编程包--线程工具类
- java多线程编程之使用Synchronized块同步变量
- C++,多线程编程------使用同步对象编程(转)
- 【JAVA并发编程实战】12、使用condition实现多线程下的有界缓存先进先出队列
- 多线程编程------使用同步对象编程
- java多线程编程之使用Synchronized关键字同步类方法
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- java多线程编程之使用Synchronized块同步方法
- Solaris2.4 多线程编程指南3--使用同步对象编程
- java多线程编程之使用Synchronized块同步方法
- python多线程编程: 使用互斥锁同步线程
- Java多线程编程之CountDownLatch同步工具使用实例
- Solaris2.4 多线程编程指南3--使用同步对象编程
- java多线程编程之使用Synchronized块同步变量
- java多线程编程之使用Synchronized块同步变量
- 多线程编程13-----Exchanger同步工具类实现两线程数据交换
- python多线程编程: 使用互斥锁同步线程
- C#多线程编程之:使用ReaderWriterLock类实现多用户读/单用户写同步
- Solaris2.4 多线程编程指南3--使用同步对象编程
- 多线程编程:何时使用同步类