阿里面題:三個線程順序打印XYZ並且打印10遍

阿里面題:三個線程順序打印XYZ並且打印10遍

阿里面題:三個線程順序打印XYZ

最近參加了阿里的筆試,遇到一個面試題:用三個線程,每個線程各打印一個字符,按照XYZ的順序打印10遍。

最近加班導致狀態不好也沒有準備面試的東西,在有限的時間內回答的不是很好。

今天重新又理了理思路,我自己的理解,這個題考察多線程使用和線程間的同步。

第一種實現方式

用最原始的方式實現,定義一個變量,按照XYZ的順序改變這個共享變量。定義三個線程,每個線程打印一個字符,打印前檢查是否應該打印,如果是就打印,並且改變共享變量,讓下一個線程打印。

這種沒有考慮性能,只是實現了需求,全部代碼如下:

阿里面題:三個線程順序打印XYZ並且打印10遍

第一種實現方式

第二種實現方式

第一種方式明顯太佔cpu了,如果線程執行時間長肯定浪費了很多資源,我們這次試用等待通知的形式,如果不是自己要打印的字符就讓出鎖,自己等待被通知,如果是,打印完字符,通知下一個線程。

我用的Lock的Condition,其中的Condition的await是讓當前線程等等讓出鎖,自己加入等待隊列,signal方法是通知等待的線程。(也可以用wait和notiy方式實現,原理差不多)

阿里面題:三個線程順序打印XYZ並且打印10遍

第二種實現方式

如果有更好的實現方式,歡迎留言,一起討論,謝謝!


分享到:


相關文章: