思路:给每个线程配一个信号量,后一个线程等前一个释放,第一个等最后一个释放,形成循环等待链,然后手动给第一个线程释放一个信号量使得程序执行起来
import java.util.concurrent.Semaphore;
public class mutil_print {
public static volatile int i;
public static int nums;
public static class TA implements Runnable{
Semaphore semaphore;
Semaphore semaphore1;
TA(Semaphore s,Semaphore s1){
semaphore=s;
semaphore1=s1;
}
@Override
public void run() {
while(i<nums){
try {
//等待前一个线程释放当前线程的资源,使得当前线程执行
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i<nums){
System.out.println(i+":"+Thread.currentThread().getName());
}
i++;
//释放下一个线程的资源
semaphore1.release();
}
}
}
public static void main(String[] args) {
//思路:给每个线程配一个信号量,后一个线程等前一个释放,第一个等最后一个释放
//形成循环等待链,然后手动给第一个线程释放一个信号量使得程序执行起来
//多线程交替打印
int Thread_nums=3;//交替打印的线程数量
nums=10;//总共打印多少次
//1.设置信号量
Semaphore []semaphores=new Semaphore[Thread_nums];
for(int i=0;i<semaphores.length;i++){
semaphores[i]=new Semaphore(0);
}
//2.设置初始信号量,这里从哪个开始设置就从哪个线程开始执行
semaphores[0].release();//设置初始信号量
//3.设置线程并启动,开始打印
for(int i=0;i<semaphores.length-1;i++){
new Thread(new TA(semaphores[i],semaphores[i+1])).start();
}
new Thread(new TA(semaphores[semaphores.length-1],semaphores[0])).start();
}
}