写两个线程,交替打印数字和字母。
package com.commontest.thread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by jiangfuqiang on 2016/5/13.
*/
public class ThreadPoolTest {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
Condition digitLock = lock.newCondition();
Condition charLock = lock.newCondition();
AtomicBoolean flag = new AtomicBoolean(false);
new Thread(new Thread1(digitLock,charLock,flag,lock)).start();
new Thread(new Thread2(digitLock,charLock,flag,lock)).start();
}
}
class Thread1 implements Runnable {
private Condition digitLock;
private AtomicBoolean flag;
private Condition charLock;
private ReentrantLock lock;
public Thread1(Condition digitLock, Condition charLock, AtomicBoolean flag, ReentrantLock lock) {
this.digitLock = digitLock;
this.flag = flag;
this.charLock = charLock;
this.lock = lock;
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.print((i+1));
lock.lock();
if (i >= 9) {
flag.set(true);
charLock.signal();
lock.unlock();
break;
}
try {
charLock.signal();
digitLock.await();
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Thread2 implements Runnable {
private Condition digitLock;
private AtomicBoolean flag;
private Condition charLock;
private ReentrantLock lock;
public Thread2(Condition digitLock, Condition charLock,AtomicBoolean flag, ReentrantLock lock) {
this.digitLock = digitLock;
this.flag = flag;
this.charLock = charLock;
this.lock = lock;
}
public void run() {
for (int i = 0; i < 26; i++) {
if (i != 0 && i%2 == 0 && !flag.get()) {
try {
lock.lock();
digitLock.signal();
charLock.await();
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print((char)(97+i));
}
}
}