当前位置: 首页 > 知识库问答 >
问题:

使用3个打印不同范围的线程按排序顺序打印数字

宋鸿德
2023-03-14

这个问题是在电子艺术采访中提出的。

有三条线。第一个线程打印1到10个数字。第二个线程打印从11到20的数字。第三条线从21到30。现在这三个线程都在运行。然而,数字是按不规则的顺序打印的,如1、11、2、21、12等。

如果我想让数字按排序顺序打印,比如1,2。。。我该怎么处理这些线呢?

共有3个答案

公良泰宁
2023-03-14

也许所有三个线程用来打印数字的单一静态方法应该锁定,检查已经打印的数字,如果它的数字准备好打印,打印并继续前进,否则解锁并屈服。

仲孙兴平
2023-03-14

似乎是一个自然的障碍。三个过程,两个障碍(称之为barrier10barrier20)。

过程1:

Print 1-10
Wait on barrier10
Wait on barrier20
Exit

过程二:

Wait on barrier10
Print 11-20
Wait on barrier20
Exit

过程3:

Wait on barrier10
Wait on barrier20
Print 21-30
Exit
高嘉树
2023-03-14

使用线程可以挂起的共享条件对象。该条件可以处于以下三种状态中的任何一种:0、1、2。该条件用状态0初始化。1-10个线程与状态0相关联,11-20个线程与状态1相关联,最后一个线程与状态2相关联。每个线程在启动时都会检查条件,如果条件的状态与线程关联的状态不同,则挂起该条件。一次只允许一个线程运行并打印其范围。当一个线程打印了其范围时,它会增加条件的状态,唤醒等待它的线程并终止。这应该可以解决问题。

如果线程不允许挂起,那么让它们在代表3个线程的“有序调度”的共享对象上轮询。

另一种方法是给线程上链:让第二个线程阻塞,直到第一个线程终止,让第三个线程阻塞,直到第二个线程完成。这个解决方案不需要共享对象,但是每个线程需要知道它的前身

 类似资料:
  • 采访中问 有三条线。第一条线打印100到199个数字。第二个线程打印200到299之间的数字。第三条线从300到399。执行的顺序是

  • 我试图创建一个实现,其中多个线程打印序列的备用值。这里thread1将打印1,4,7 thread2将打印2,5,8 thread3将打印3,6,9。我用的是原子整数和模函数。 下面的实现可以很好地工作,第一个线程打印1,4,7,第二个线程打印2,5,8,第三个线程打印3,6,9,但问题是没有保持顺序,即输出可能类似于1,3,2,4,5,7,8,6,9,而我希望保持顺序,因为正确的线程可以打印这些

  • 我正在回答以下面试问题: 一个进程有三个线程。第一个线程打印1 1 1...,第二个打印2 2 2...,第三个打印3 3 3...无休止。你如何安排这三个线程以打印1 2 3 1 2 3... 我想出了下面的代码,使用两个线程打印,但我无法找出如何从第三个线程在这里打印数字的条件。 如何有效地解决这类问题?

  • 有两个线程,一个是打印偶数,另一个是打印奇数。在下面自定义锁的帮助下,我想按顺序打印数字。问题出在打印一些数字后(显示的数字顺序正确。)线程越来越死机。我花了一个多小时还是找不到问题,对我来说一切都很好。

  • 问题内容: 该程序输出- 它不应该提供输出- 因为首先ai应该打印1,然后执行a.getI()并应该打印A 2 问题答案: 在此表达式中: 首先评估对的调用,然后通过连接加号形成字符串

  • 问题内容: 使用线程进行奇数打印,创建一个线程类,两个线程实例。 一个将打印奇数,而另一个将打印偶数。 我做了以下编码。但这涉及到死锁状态。有人可以解释一下原因吗? 输出: 奇数1偶数2 然后陷入僵局!!!!!! 谢谢你的帮助。 问题答案: 您正在等待并通知其他对象( 监视器 )。 这个想法是,你在做和做的时候可以打电话等待一个人做。 将您的方法更改为类似 和方法类似。 然后为提供一个对象: 输出