昨天朋友提出了一个问题:
写两个线程,其中一个线程打印1-52,另一个线程打印A-Z,打印顺序应该是12A34B56C……5152Z。
可以通过信号量来解决线程之间的通信。
方案1(信号量)
线程1打印数字,线程2打印字母。线程1每执行循环两次,执行线程2循环一次。采用信号量做两个线程间的通信,CountDownLatch来保证线程1,线程2循环体的执行顺序。
注:这个方案核心在于当前线程请求的信号量由另一个线程释放(到当前线程可以继续执行的时机),因此也需考虑只存活一个线程(或者一个线程循环主体已经退出的情况),因此在另一个线程已经完成的情况下,当前线程的信号量由自己释放。
代码如下:
private static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) {
Thread1_1 t1_1 = new Thread1_1();
Thread1_2 t1_2 = new Thread1_2();
t1_1.init(t1_2);
t1_2.init(t1_1);
t1_1.start();
t1_2.start();
}
private static abstract class CommonThread1 extends Thread {
private Semaphore sem = new Semaphore(1);
protected CommonThread1 otherThread;