Java多线程Lock Condition的使用介绍
假设:多线程之间按照顺序调用,实现A->B->C->A->B->C…->A,要求用3个线程实现:
A打印5次,B打印10次,C打印15次
接着
A打印5次,B打印10次,C打印15次
…来10轮
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ConditionDemo {
//标志位(当num=1时A线程执行,当num=2时B线程执行,当num=3时C线程执行)
private int num = 1;
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public void printA5(){
lock.lock();
try{
//判断,当num为1时A线程执行
while(num != 1){
condition1.await();
}
//A线程打印5次
for (int i = 1; i <= 5 ; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//A线程执行完成后修改标志位,让B线程可以执行,此时num修改为2
num = 2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printB10(){
lock.lock();
try{
//判断,当num为1时A线程执行
while(num != 2){
condition2.await();
}
//A线程打印5次
for (int i = 1; i <= 10 ; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//A线程执行完成后修改标志位,让B线程可以执行,此时num修改为2
num = 3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printC15(){
lock.lock();
try{
//判断,当num为1时A线程执行
while(num != 3){
condition3.await();
}
//A线程打印5次
for (int i = 1; i <= 15 ; i++) {
System.out.println(Thread.currentThread().getName() + "\t" + i);
}
//A线程执行完成后修改标志位,让B线程可以执行,此时num修改为2
num = 1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
class Main1{
public static void main(String[] args) {
ConditionDemo conditionDemo = new ConditionDemo();
new Thread(() -> {
for (int i = 1; i <= 10 ; i++) {
conditionDemo.printA5();
}
},"A").start();
new Thread(() -> {
for (int i = 1; i <= 10 ; i++) {
conditionDemo.printB10();
}
},"B").start();
new Thread(() -> {
for (int i = 1; i <= 10 ; i++) {
conditionDemo.printC15();
}
},"C").start();
}
}
执行结果如下:
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
A 1
A 2
A 3
A 4
A 5
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
B 9
B 10
C 1
C 2
C 3
C 4
C 5
C 6
C 7
C 8
C 9
C 10
C 11
C 12
C 13
C 14
C 15
本文介绍了Java多线程中Lock和Condition的应用,通过一个具体的实例展示了如何使用Lock和Condition来控制线程间按照特定顺序执行。文章中提到,需要实现3个线程A、B、C交替执行,其中A打印5次,B打印10次,C打印15次,如此重复10轮。内容详细解释了如何设置条件和同步机制以确保线程执行的正确顺序。
589

被折叠的 条评论
为什么被折叠?



