編寫一個程序,開啓3個線程,這三個線程的ID分別爲A、B、C,每個線程將自己的ID在屏幕上打印10遍,要求輸出的結果必須按順序顯示。
一道Java併發相關的面試題。本文使用Lock+Condition實現。
package com.xudc.juc;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 編寫一個程序,開啓3個線程,這三個線程的ID分別爲A、B、C,每個線程將自己的ID在屏幕上打印10遍,要求輸出的結果必須按順序顯示。
* 如:ABCABCABCABC...依次遞歸
* @author xudc
*/
public class TestAlternate {
public static void main(String[] args) {
Alternate alternate = new Alternate();
final int count = 10;
new Thread(() -> {
for (int i = 0; i < count; i++) {
alternate.printA();
}
},"A").start();
new Thread(() -> {
for (int i = 0; i < count; i++) {
alternate.printB();
}
},"B").start();
new Thread(() -> {
for (int i = 0; i < count; i++) {
alternate.printC();
}
},"C").start();
}
}
class Alternate{
private final Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
private int number = 1;
public void printA(){
lock.lock();
try {
while (number != 1) {
conditionA.await();
}
System.out.print("A");
number = 2;
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printB(){
lock.lock();
try {
while (number != 2) {
conditionB.await();
}
System.out.print("B");
number = 3;
conditionC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void printC(){
lock.lock();
try {
while (number != 3) {
conditionC.await();
}
System.out.print("C");
number = 1;
conditionA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
運行結果:
ABCABCABCABCABCABCABCABCABCABC
原文地址:https://xudc.tech/2019/06/01/thread-interview-1/