package cn.itcast.gz; |
import java.util.concurrent.locks.Condition; |
import java.util.concurrent.locks.Lock; |
import java.util.concurrent.locks.ReentrantLock; |
/** |
*
第一个线程循环5次,接着第二个线程循环10次, |
*
接着第三个线程循环15次,然后又到第一个线程循环5次 |
*
如此往复执行50次 |
* |
*/ |
public class Interview3
{ |
public static void main(String[]
args) { |
ThreadTest3
threadTest3 = new ThreadTest3(); |
Thread
t1 = new Thread(threadTest3); |
Thread
t2 = new Thread(threadTest3); |
Thread
t3 = new Thread(threadTest3); |
t1.start(); |
t2.start(); |
t3.start(); |
} |
} |
class ThreadTest3 implements Runnable |
{ |
private Lock
lock = new ReentrantLock(); |
private int j
= 0 ; |
private int k
= 1 ; |
Condition
con1 = lock.newCondition(); |
Condition
con2 = lock.newCondition(); |
Condition
con3 = lock.newCondition(); |
public void father() |
{ |
lock.lock(); |
try { |
while (j!= 0 ) |
con1.await(); |
for ( int i
= 1 ;i<= 5 ;i++) |
{ |
System.out.println( "Thread
A..." +i); |
} |
j=(j+ 1 )% 3 ; |
con2.signal(); |
} catch (Exception
e) { |
e.printStackTrace(); |
} |
finally |
{ |
lock.unlock(); |
} |
} |
public void son() |
{ |
lock.lock(); |
try { |
while (j!= 1 ) |
con2.await(); |
for ( int i
= 1 ;i<= 10 ;i++) |
{ |
System.out.println( "Thread
B..." +i); |
} |
j=(j+ 1 )% 3 ; |
con3.signal(); |
} catch (Exception
e) { |
e.printStackTrace(); |
} |
finally |
{ |
lock.unlock(); |
} |
} |
public void granson() |
{ |
lock.lock(); |
try { |
while (j!= 2 ) |
con3.await(); |
for ( int i
= 1 ;i<= 15 ;i++) |
{ |
System.out.println( "Thread
C..." +i); |
} |
j=(j+ 1 )% 3 ; |
con1.signal(); |
} catch (Exception
e) { |
e.printStackTrace(); |
} |
finally |
{ |
lock.unlock(); |
} |
} |
@Override |
public void run()
{ |
for ( int i
= 0 ;i< 3 ;i++) |
{ |
if (k== 1 ) |
{ |
father(); |
k=(k+ 1 )% 3 ; |
} |
else if (k== 2 ) |
{ |
son(); |
k=(k+ 1 )% 3 ; |
} |
else |
{ |
granson(); |
k=(k+ 1 )% 3 ; |
} |
} |
/*
father(); |
son(); |
granson();*/ |
} |
} |