![阿里面題:三個線程順序打印XYZ並且打印10遍](http://p2.ttnews.xyz/loading.gif)
阿里面題:三個線程順序打印XYZ
最近參加了阿里的筆試,遇到一個面試題:用三個線程,每個線程各打印一個字符,按照XYZ的順序打印10遍。
最近加班導致狀態不好也沒有準備面試的東西,在有限的時間內回答的不是很好。
今天重新又理了理思路,我自己的理解,這個題考察多線程使用和線程間的同步。
第一種實現方式
用最原始的方式實現,定義一個變量,按照XYZ的順序改變這個共享變量。定義三個線程,每個線程打印一個字符,打印前檢查是否應該打印,如果是就打印,並且改變共享變量,讓下一個線程打印。
這種沒有考慮性能,只是實現了需求,全部代碼如下:
![阿里面題:三個線程順序打印XYZ並且打印10遍](http://p2.ttnews.xyz/loading.gif)
第一種實現方式
第二種實現方式
第一種方式明顯太佔cpu了,如果線程執行時間長肯定浪費了很多資源,我們這次試用等待通知的形式,如果不是自己要打印的字符就讓出鎖,自己等待被通知,如果是,打印完字符,通知下一個線程。
我用的Lock的Condition,其中的Condition的await是讓當前線程等等讓出鎖,自己加入等待隊列,signal方法是通知等待的線程。(也可以用wait和notiy方式實現,原理差不多)
第二種實現方式
如果有更好的實現方式,歡迎留言,一起討論,謝謝!