线程类(只负责调用资源类,并启动线程,不负责锁)
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
//A、B、C三个线程接力
public class ThreadDemo05 {
public static void main(String[] args) {
final ShareResource sr = new ShareResource();
FutureTask ft = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
for (int i = 1; i <= 10; i++) {
sr.printA(i);
}
return null;
}
});
new Thread(ft, "aa").start();
FutureTask ft2 = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
for (int i = 1; i <= 10; i++) {
sr.printB(i);
}
return null;
}
});
new Thread(ft2, "bb").start();
FutureTask ft3 = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
for (int i = 1; i <= 10; i++) {
sr.printC(i);
}
return null;
}
});
new Thread(ft3, "cc").start();
}
}
资源类:(锁是在资源类中)
class ShareResource {
private int flag = 1; // 1->A,2-B,3-C
private Lock lock = new ReentrantLock();
private Condition c1 = lock.newCondition(); //只有一个是不行的
private Condition c2 = lock.newCondition();
private Condition c3 = lock.newCondition();
public void printA(int totalLoop) {
lock.lock();
try {
// 1.判断
while (flag != 1) {
c1.await();
}
// 2.干活
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i + "轮数:" + totalLoop);
}
// 3.通知唤醒
flag = 2;
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB(int totalLoop) {
lock.lock();
try {
while (flag != 2) {
c2.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i + "轮数:" + totalLoop);
}
flag = 3;
c3.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC(int totalLoop) {
lock.lock();
try {
while (flag != 3) {
c3.await();
}
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "--" + i + "轮数:" + totalLoop);
}
flag = 1;
c1.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}