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();
}
}
}
}