多线程通信方式
- Object的wait和notify、notifyall
- ReentrantLock中Condition的await和signal、signalAll
三个线程轮流打印AA、BB和CC
实现方式1
package com.mine.juc.multithreadcommunication;
class Resource {
private int flag = 1;
public synchronized void printAA(int num) throws InterruptedException {
while (flag != 1) {
this.wait();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":AA");
}
flag = 2;
this.notifyAll();
}
public synchronized void printBB(int num) throws InterruptedException {
while (flag != 2) {
this.wait();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":BB");
}
flag = 3;
this.notifyAll();
}
public synchronized void printCC(int num) throws InterruptedException {
while (flag != 3) {
this.wait();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":CC");
}
flag = 1;
this.notifyAll();
}
}
public class Example1 {
public static void main(String[] args) {
final Resource resource = new Resource();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printAA(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程1").start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printBB(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程2").start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printCC(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程3").start();
}
}
实现方式2
package com.mine.juc.multithreadcommunication;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Resource2 {
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
private int flag = 1;
public void printAA(int num) throws InterruptedException {
lock.lock();
try {
while (flag != 1) {
condition1.await();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":AA");
}
flag = 2;
condition2.signal();
} finally {
lock.unlock();
}
}
public void printBB(int num) throws InterruptedException {
lock.lock();
try {
while (flag != 2) {
condition2.await();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":BB");
}
flag = 3;
condition3.signal();
} finally {
lock.unlock();
}
}
public void printCC(int num) throws InterruptedException {
lock.lock();
try {
while (flag != 3) {
condition3.await();
}
for (int i = 0; i < num; i++) {
System.out.println(Thread.currentThread().getName() + ":CC");
}
flag = 1;
condition1.signal();
} finally {
lock.unlock();
}
}
}
public class Example2 {
public static void main(String[] args) {
final Resource2 resource = new Resource2();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printAA(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程1").start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printBB(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程2").start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 3; i++) {
try {
resource.printCC(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "线程3").start();
}
}