多线程刷题

1.FirstSecondThird按序打印:控制条件使second在first之后打印,third在second之后打印,用CountDwonLatch实现,可以创建两个CountDownLatch,调用CountDownLatch的await()使当前线程阻塞,因为CountDownLatch的await()是使当前线程一直阻塞直到该CountDownLatch的getCount()==0,而每一次调用CountDownLatch的countDown()都会使getCount()的返回值减1.

2.Foo和Bar交替打印,且Foo要在Bar之前。可以使Foo拥有一个控制Bar执行的变量,由于根据传入的num可能要交替多次执行,就需要他们两互相拥有控制对方执行的变量,且一定使Foo先符合条件。在CountDownLatch,Semphore,CyclicBarrier这三个中,选择用Semphore,因为昨天刚好看了这些个文章。需要注意的使Semphore的acquire()方法,是消耗一个信号来执行,没有信号可以消耗则阻塞,而release是释放,也就是对Semphore增加一个信号量。所以让Foo和Bar分别拥有一个Semphore控制对方执行,先让Foo符合条件,则定义一个new SemphoreFoo(1)给Foo使用,一个new SemhoreBar()给bar使用,两个线程同样在第一行代码调用acquire()消耗一个信号量执行下面的其他代码,但只有Foo有一个信号量,Foo执行之后,然后调用semphoreBar.release()给semphoreBar一个信号量,使Bar从SemphoreBar.acqure()无法获取信号量的阻塞装态中退出,bar再给foo一个信号量,如此反复,就可以交替循环执行了。

------------------------------------------------------2020-11-12

 

posted on 2020-11-11 20:08  我欲皆真  阅读(107)  评论(0编辑  收藏  举报

导航