这三个线程分别为A,B,C,我们可以把这三个线程当成父,子,孙三个线程,每个线程要循环输出十次。然后要有一个类去完成他们的任务就是输出当前线程的名字,然后我们可以用condition实现三个线程的交替输出。
/**
* 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,
* 每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;
* 如:ABCABC….依次递推
*
* PrintABC
* 创建人:LBM
* 时间:2016年11月25日-上午9:34:53
* @version 1.0.0
*
*/
public class PrintABC {
public static void main(String[] args) {
PrintClass printClass = new PrintClass();
new Thread(new Runnable() {
@Override
public void run() {//线程A
for( int i=1;i<=10;i++){
printClass.PrintNameA(i);
}
}
},"A").start();
new Thread(new Runnable() {//线程B
@Override
public void run() {
for( int i=1;i<=10;i++){
printClass.PrintNameB(i);
}
}
},"B").start();
new Thread(new Runnable() {//线程C
@Override
public void run() {
for( int i=1;i<=10;i++){
printClass.PrintNameC(i);
}
}
},"C").start();
}
static class PrintClass{
private String flag = "A";
Lock lock = new ReentrantLock();
Condition conditionA = lock.newCondition();//控制A线程运行
Condition conditionB = lock.newCondition();//控制B线程运行
Condition conditionC = lock.newCondition();//控制C线程运行
public void PrintNameA(int i){//线程A的任务
lock.lock();
while (!"A".equals(flag)) {
try {
conditionA.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try{
System.out.println("A线程第"+i+"次输出---"+Thread.currentThread().getName());
flag ="B";
conditionB.signal();
}finally {
lock.unlock();
}
}
public void PrintNameB(int i){//线程B的任务
lock.lock();
while (!"B".equals(flag)) {
try {
conditionB.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try{
System.out.println("B线程第"+i+"次输出---"+Thread.currentThread().getName());
flag ="C";
conditionC.signal();
}finally {
lock.unlock();
}
}
public void PrintNameC(int i){//线程C的任务
lock.lock();
while (!"C".equals(flag)) {
try {
conditionC.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try{
System.out.println("C线程第"+i+"次输出---"+Thread.currentThread().getName());
flag ="A";
conditionA.signal();
}finally {
lock.unlock();
}
}
}
}
打印结果如下:
A线程第1次输出---A
B线程第1次输出---B
C线程第1次输出---C
A线程第2次输出---A
B线程第2次输出---B
C线程第2次输出---C
A线程第3次输出---A
B线程第3次输出---B
C线程第3次输出---C
A线程第4次输出---A
B线程第4次输出---B
C线程第4次输出---C
A线程第5次输出---A
B线程第5次输出---B
C线程第5次输出---C
A线程第6次输出---A
B线程第6次输出---B
C线程第6次输出---C
A线程第7次输出---A
B线程第7次输出---B
C线程第7次输出---C
A线程第8次输出---A
B线程第8次输出---B
C线程第8次输出---C
A线程第9次输出---A
B线程第9次输出---B
C线程第9次输出---C
A线程第10次输出---A
B线程第10次输出---B
C线程第10次输出---C