import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class AbcThread {
public static void main(String[] args) {
String[] abc = { "a", null, null };
Lock lock = new ReentrantLock();
Condition cond = lock.newCondition();
new Thread(() -> {
for (;;) {
lock.lock();
while (abc[0] == null) {
try {
cond.await();
} catch (InterruptedException e) {
}
}
System.out.print('a');
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
abc[0] = null;
abc[1] = "b";
cond.signalAll();
lock.unlock();
}
}).start();
new Thread(() -> {
for (;;) {
lock.lock();
while (abc[1] == null) {
try {
cond.await();
} catch (InterruptedException e) {
}
}
System.out.print('b');
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
abc[1] = null;
abc[2] = "c";
cond.signalAll();
lock.unlock();
}
}).start();
new Thread(() -> {
for (;;) {
lock.lock();
while (abc[2] == null) {
try {
cond.await();
} catch (InterruptedException e) {
}
}
System.out.print('c');
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
abc[2] = null;
abc[0] = "a";
cond.signalAll();
lock.unlock();
}
}).start();
}
}
今天又想了想,昨天的方法有点蠢啊,重新写了个新的方式
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class AbcThread {
static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) {
new Thread(create(0, 'a')).start();
new Thread(create(1, 'b')).start();
new Thread(create(2, 'c')).start();
}
static Runnable create(int printNum, char printChar) {
return () -> {
for(;;) {
if (num.intValue() % 3 == printNum) {
System.out.print(printChar);
num.incrementAndGet();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {}
}
}
};
}
}