这道java多线程面试题你未必知道答案

  看了一道阿里面试的时候遇到的多线程题目,这个题目比较有意思,在这里和大家分享一下。

  通过N个线程顺序循环打印从0至100,如给定N=3则输出:

  thread0: 0

  thread1: 1

  thread2: 2

  thread0: 3

  thread1: 4……

  你可能会给出这样的答案:

  N个线程进行循环打印,可以利用Object中的wait和notify来解决,上面run方法就是实现Runnable的方法。

  上面的答案虽然可以得到想要的结果,但是,假如N是很大的数呢,下面让我们来分析一下。

  比如现在有100个线程,现在是第一个线程在执行,他执行完之后需要第二个线程执行,但是第100个线程抢到了,发现不是自己然后又进入wait,然后第99个线程抢到了,发现不是自己然后又进入wait,然后第98,97……直到第3个线程都抢到了,最后才到第二个线程抢到同步锁,这里就会白白的多执行很多过程。

  有没有比较好的方法呢,答案肯定是有的。

  在Java的多线程中提供了一些常用的同步器,在这个场景下比较适合于使用Semaphore,也就是信号量,我们上一个线程持有下一个线程的信号量,通过一个信号量数组将全部关联起来,代码如下:

  通过这种方式,就不会有白白唤醒的线程,每一个线程都按照我们所约定的顺序去执行,这其实也是面试官所需要考的地方,让每个线程的执行都能在你手中得到控制,这也可以验证你多线程知识是否牢固。

  大连妇科医院排名 http://www.bohaifk.com/

猜你喜欢

转载自www.cnblogs.com/2655534102gyt/p/10635184.html