背景
用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26 而且是交替形式 线程1输出A——线程二输出1 线程1输出B——线程二输出2 线程1输出C——线程二输出3 以此类推
分析
主要考察线程之间的通信,思路就是创建两个线程
在一个线程输出一个内容之后,自己进入阻塞,去唤醒另一个线程
另一个线程同样,输出一个内容之后,自己进入阻塞,去唤醒另一个线程
代码实现(一)
{ ([] ) { [] .(); [] {,,,,,,,,,,,,,,,,,,,,,,,,,}; (, ); } ([] ,[] ){ (); (() { () { ( : ) { ..( ); { .(); .(); } ( ) { .(); } } .(); } }, ).(); (() { () { ( : ) { ..(); { .(); .(); } ( ) { .(); } } .(); } }, ).(); } }
运行一下,确实实现了交替输出,但是多运行几次,就会发现问题
有时候是数字先输出,有时候是字母先输出
即两个线程谁先启动的顺序是不固定的
倘若试题中再加一句,必须要字母先输出,怎么办?
代码实现(二)
{ ; ([] ) { [] .(); [] {,,,,,,,,,,,,,,,,,,,,,,,,,}; (, ); } ([] ,[] ){ (); (() { () { (){ ; } ( : ) { ..(); { .(); .(); } ( ) { .(); } } .(); } }, ).(); (() { () { (){ { .(); } ( ) { .(); } } ( : ) { ..( ); { .(); .(); } ( ) { .(); } } .(); } }, ).(); } }
如此问题可以得到解决,但有更优(装)雅(B)的解决办法
CountDownLatch实现
{ (); ([] ) { [] .(); [] {,,,,,,,,,,,,,,,,,,,,,,,,,}; (, ); } ([] ,[] ){ (); (() { () { .(); ( : ) { ..(); { .(); .(); } ( ) { .(); } } .(); } }, ).(); (() { () { { .(); } ( ) { .(); } ( : ) { ..( ); { .(); .(); } ( ) { .(); } } .(); } }, ).(); } }
以上就是synchronized实现两个线程交替运行的解法,欢迎留言交流