Test01
public class Test01 {
private static Lock lock = new ReentrantLock();
private static Condition condition = lock.newCondition();
static class Task implements Runnable {
@Override
public void run() {
System.out.println("...子线程开始, 尝试获取锁");
lock.lock();
try {
System.out.println("...子线程获取锁成功");
System.out.println("...子线程等待");
condition.await();
System.out.println("...子线程等待结束(被唤醒)");
System.out.println("...子线程休眠3S");
Thread.sleep(3000);
} catch (Exception e) {
System.out.println("...子线程异常");
} finally {
lock.unlock();
System.out.println("...子线程锁释放");
}
}
}
public static void main(String[] args) throws InterruptedException {
Task task = new Task();
System.out.println("main开启子线程");
new Thread(task).start();
System.out.println("main主线程休眠3S");
Thread.sleep(3000);
System.out.println("main尝试获取锁");
lock.lock();
try {
System.out.println("main线程获取锁成功");
System.out.println("main唤醒子线程");
condition.signal();
} finally {
lock.unlock();
System.out.println("main线程锁释放");
}
}
}
Test02
public class Test02 {
private static ReentrantLock lock = new ReentrantLock();
private static Condition conditionA = lock.newCondition();
private static Condition conditionB = lock.newCondition();
static class TaskA implements Runnable {
@Override
public void run() {
System.out.println("TaskA...子线程开始, 尝试获取锁");
lock.lock();
try {
System.out.println("TaskA...子线程获取锁成功");
System.out.println("TaskA...子线程休眠3S(1)\n");
Thread.sleep(3000);
System.out.println("TaskA...子线程等待");
conditionA.await();
System.out.println("TaskA...子线程等待结束(被唤醒)");
System.out.println("TaskA...子线程休眠3S(2)\n");
Thread.sleep(3000);
} catch (Exception e) {
System.out.println("TaskA...子线程异常");
} finally {
lock.unlock();
System.out.println("TaskA...子线程锁释放");
}
}
}
static class TaskB implements Runnable {
@Override
public void run() {
System.out.println("TaskB...子线程开始, 尝试获取锁");
lock.lock();
try {
System.out.println("TaskB...子线程获取锁成功");
System.out.println("TaskB...子线程休眠3S(1)\n");
Thread.sleep(3000);
System.out.println("TaskB...子线程等待");
conditionB.await();
System.out.println("TaskB...子线程等待结束(被唤醒)");
System.out.println("TaskB...子线程休眠3S(2)\n");
Thread.sleep(3000);
} catch (Exception e) {
System.out.println("TaskB...子线程异常");
} finally {
lock.unlock();
System.out.println("TaskB...子线程锁释放");
}
}
}
public static void main(String[] args) throws InterruptedException {
TaskA taskA = new TaskA();
TaskB taskB = new TaskB();
System.out.println("main开启子线程");
new Thread(taskA).start();
new Thread(taskB).start();
System.out.println("main主线程休眠3S(1)\n");
Thread.sleep(3000);
System.out.println("main尝试获取锁TaskA");
lock.lock();
try {
System.out.println("main线程获取锁成功TaskA");
System.out.println("main唤醒子线程TaskA");
conditionA.signal();
} finally {
lock.unlock();
System.out.println("main线程锁释放TaskA");
}
System.out.println("main主线程休眠3S(2)\n");
Thread.sleep(3000);
lock.lock();
try {
System.out.println("main线程获取锁成功TaskB");
System.out.println("main唤醒子线程TaskB");
conditionA.signal();
System.out.println("main唤醒子线程TaskB");
conditionB.signal();
} finally {
lock.unlock();
System.out.println("main线程锁释放TaskB");
}
}
}
Test03
public class Test03 {
private static ReentrantLock lock = new ReentrantLock();
private static Condition condition = lock.newCondition();
private static boolean flag = true;
static class TaskA implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (flag) {
System.out.println(Thread.currentThread().getName() + " >> " + "waiting...");
condition.await();
}
System.out.println(Thread.currentThread().getName() + " >> " + "---" + o);
flag = true;
condition.signal();
} catch (Exception e) {
System.out.println("TaskA...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
static class TaskB implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (! flag) {
System.out.println(Thread.currentThread().getName() + " >> " + "waiting...");
condition.await();
}
System.out.println(Thread.currentThread().getName() + " >> " + "***" + o);
flag = false;
condition.signal();
} catch (Exception e) {
System.out.println("TaskB...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
public static void main(String[] args) throws InterruptedException {
TaskA taskA = new TaskA();
TaskB taskB = new TaskB();
new Thread(taskA).start();
new Thread(taskB).start();
}
}
Test04
public class Test04 {
private static ReentrantLock lock = new ReentrantLock();
private static Condition conditionA = lock.newCondition();
private static Condition conditionB = lock.newCondition();
private static boolean flag = true;
static class TaskA implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (flag) {
System.out.println(Thread.currentThread().getName() + " >> " + "---" + o);
flag = false;
conditionB.signal();
conditionA.await();
}
} catch (Exception e) {
System.out.println("TaskA...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
static class TaskB implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (! flag) {
System.out.println(Thread.currentThread().getName() + " >> " + "***" + o);
flag = true;
conditionA.signal();
conditionB.await();
}
} catch (Exception e) {
System.out.println("TaskB...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
public static void main(String[] args) throws InterruptedException {
TaskA taskA = new TaskA();
TaskB taskB = new TaskB();
new Thread(taskA).start();
new Thread(taskB).start();
}
}
Test05
public class Test05 {
private static ReentrantLock lock = new ReentrantLock();
private static Condition conditionA = lock.newCondition();
private static Condition conditionB = lock.newCondition();
private static Condition conditionC = lock.newCondition();
private static int flag = 1;
static class TaskA implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (flag == 1) {
System.out.println(Thread.currentThread().getName() + " >> " + "-" + flag);
flag = 2;
conditionB.signal();
conditionA.await();
}
} catch (Exception e) {
System.out.println("TaskA...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
static class TaskB implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (flag == 2) {
System.out.println(Thread.currentThread().getName() + " >> " + "--" + flag);
flag = 3;
conditionC.signal();
conditionB.await();
}
} catch (Exception e) {
System.out.println("TaskB...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
static class TaskC implements Runnable {
@Override
public void run() {
Stream.iterate(0, i -> i + 1).limit(50).forEach(o -> {
lock.lock();
try {
if (flag == 3) {
System.out.println(Thread.currentThread().getName() + " >> " + "---" + flag);
flag = 1;
conditionA.signal();
conditionC.await();
}
} catch (Exception e) {
System.out.println("TaskC...线程异常" + e);
} finally {
lock.unlock();
}
});
}
}
public static void main(String[] args) throws InterruptedException {
TaskA taskA = new TaskA();
TaskB taskB = new TaskB();
TaskC taskC = new TaskC();
new Thread(taskA).start();
new Thread(taskB).start();
new Thread(taskC).start();
}
}