LeedCode多线程第六题-交替打印字符串
一.题目如下:


解题思路:
这里先说一下我自己的解题思路.
- 使用三个信号量控制其他打印字母的线程是否为可执行.
- 使用LockSupport.park(),unpark()控制主线程(打印普通数字的线程)是否可执行.
注意点:
当线程执行acquire()方法获取不到信号量时,就会进入WAITING状态,一直在这等待,主线程执行完毕后,这几个线程还在等待,导致程序永远不会执行完,所以在开始的时候把几个线程都存到队列中,在主线程执行完后一一进行中断操作,保证线程正常退出.
class FizzBuzz {
private int n;
public FizzBuzz(int n) {
this.n = n;
}
Semaphore fizzSemaphore=new Semaphore(0);
Semaphore buzzSemaphore=new Semaphore(0);
Semaphore fizzbuzzSemaphore=new Semaphore(0);
BlockingQueue<Thread> threadQueue = new LinkedBlockingQueue<>(1);
ArrayList<Thread> threadList=new ArrayList<>(3);
// printFizz.run() outputs "fizz".
public void fizz(Runnable printFizz) throws InterruptedException {
threadList.add(Thread.currentThread());
for(;;){
try{
fizzSemaphore.acquire();
}catch(InterruptedException e){
break;
}
printFizz.run();
LockSupport.unpark(threadQueue.poll());
}
}
// print

本文提供LeetCode多线程题目“交替打印字符串”的两种解决方案:一是利用信号量和LockSupport实现线程间的协作;二是采用CyclicBarrier实现线程同步。详细介绍了每种方案的设计思路和技术要点。
最低0.47元/天 解锁文章
1474

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



