操作系统利用信号量多个线程轮流打印数字

Posted 九死九歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统利用信号量多个线程轮流打印数字相关的知识,希望对你有一定的参考价值。

一、运行效果

  先看效果:

  传参3和10,那就是3个线程轮流打印10~1 。如下:

  我们不妨胆子放开点。114个线程轮流打印514~1 。像这样传参。

  运行效果:

二、代码实现

  这个其实都算很简单了。我之前写过一个复杂得多的,传参一个代表有向图的矩阵,让线程按照有向图中的前驱关系依次运行。链接在这里:【操作系统&数据结构图论】用有向图临接矩阵获得满足该前驱关系的线程数组

  这个算法其实也是传参了一个图,一个环形的图,或者说一个环形单链表,即第n个节点只有指向第n+1个节点的指针。线程的调度需要满足这个顺序。

  理清思路其实就好写多了。

import java.util.concurrent.Semaphore;

public class ThreadTest 

	static int x = 10;

	public static void func(int num, int n) 

		ThreadTest.x = n;

		Semaphore[] semaphores = new Semaphore[num];
		Thread[] threads = new Thread[num];

		for (int i = 0; i < num; i++) 
			semaphores[i] = new Semaphore(1);
		

		for (int i = 1; i < num; i++) 
			try 
				semaphores[i].acquire();
			 catch (InterruptedException e) 
				e.printStackTrace();
			
		

		for (int i = 0; i < num; i++) 

			int j = i;

			threads[i] = new Thread(() -> 
				while (true) 
					try 
						semaphores[j].acquire();
						if (x > 0) 
							System.out.println(Thread.currentThread().getName() + ": " + x--);
						 else 
							semaphores[(j + 1) % num].release();
							break;
						
						semaphores[(j + 1) % num].release();
					 catch (InterruptedException e) 
						e.printStackTrace();
					
				
			);

			threads[i].start();

		

	

	public static void main(String[] args) 
		func(114, 514);
	


以上是关于操作系统利用信号量多个线程轮流打印数字的主要内容,如果未能解决你的问题,请参考以下文章

经典多线程问题-轮流打印字母和数字

Java n个线程轮流打印数字的问题

线程轮流顺序交替执行

三个线程轮流打印1-75,一个线程一次打印5个数

头条面试题之实现两个线程轮流打印字符串

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段