제목 :이 A, B, C라는 세 개의 스레드가 있고, 지금은 콘솔, 주문 ABCABC에 인쇄 된 이름을 정렬 할 필요가 ...
아이디어 :
당신이 스레드의 실행 순서를 제어하는 잠금 장치의 사용 + 조건 + ewait + signalAll 방법 있도록 원하기 때문에
실행 방법의 클래스 스레드 :
class ABC {
private int num = 1;
Lock lock = new ReentrantLock();
// 每一个Condition控制一个线程,让它们有序的执行
Condition condition1 = lock.newCondition();
Condition condition2 = lock.newCondition();
Condition condition3 = lock.newCondition();
public void lockA(){
lock.lock();
try {
if(num!=1){
try {
condition1.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName());
num = 2;
condition2.signalAll();
} finally {
lock.unlock();
}
}
public void lockB(){
lock.lock();
try {
if(num!=2){
try {
condition2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName());
num = 3;
condition3.signalAll();
} finally {
lock.unlock();
}
}
public void lockC(){
lock.lock();
try {
if(num!=3){
try {
condition3.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName());
num = 1;
condition1.signalAll();
}finally {
lock.unlock();
}
}
}
Thread 클래스 :
class JymTestDemo implements Runnable{
private ABC abc = new ABC();
public void run() {
if(Thread.currentThread().getName().equals("A")){
for(int i =0;i<10;i++){
abc.lockA();
}
}
else if (Thread.currentThread().getName().equals("B")){
for(int i =0;i<10;i++){
abc.lockB();
}
}
else if (Thread.currentThread().getName().equals("C")){
for(int i =0;i<10;i++){
abc.lockC();
}
}
}
}
시험 방법 :
public class JymTest {
public static void main(String[] args) {
JymTestDemo jymTestDemo = new JymTestDemo();
new Thread(jymTestDemo,"A").start();
new Thread(jymTestDemo,"B").start();
new Thread(jymTestDemo,"C").start();
}
}
결과 :