synchronized实现两个线程交替运行
  TEZNKK3IfmPf 2023年11月15日 18 0
用两个线程交替输出A-Z和1-26,即一个线程输出A-Z,另一个线程输出1-26
而且是交替形式

线程1输出A——线程二输出1
线程1输出B——线程二输出2
线程1输出C——线程二输出3
以此类推

分析

主要考察线程之间的通信,思路就是创建两个线程

在一个线程输出一个内容之后,自己进入阻塞,去唤醒另一个线程

另一个线程同样,输出一个内容之后,自己进入阻塞,去唤醒另一个线程

代码实现(一)

   {

       ([] ) {

         []   .();
         []   {,,,,,,,,,,,,,,,,,,,,,,,,,};

        (, );
    }

       ([] ,[] ){

             ();


        
         (()  {
             () {
                 (  : ) {
                    ..( );
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();


        
         (()  {
             () {
                 (  : ) {
                    ..();
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();

    }
}

运行一下,确实实现了交替输出,但是多运行几次,就会发现问题

有时候是数字先输出,有时候是字母先输出

即两个线程谁先启动的顺序是不固定的

倘若试题中再加一句,必须要字母先输出,怎么办?

代码实现(二)

 
 
   {

           ;
       ([] ) {

         []   .();
         []   {,,,,,,,,,,,,,,,,,,,,,,,,,};

        (, );
    }

       ([] ,[] ){

             ();

        
         (()  {
             () {
                 (){ 
                      ;
                }
                 (  : ) {
                    ..();
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();


        
         (()  {
             () {
                 (){
                     {
                        .();
                    }  ( ) {
                        .();
                    }
                }

                 (  : ) {
                    ..( );
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();

    }


}

如此问题可以得到解决,但有更优(装)雅(B)的解决办法

CountDownLatch实现

 
 
   {

          ();
       ([] ) {

         []   .();
         []   {,,,,,,,,,,,,,,,,,,,,,,,,,};

        (, );
    }

       ([] ,[] ){

             ();

        
         (()  {
             () {
                .();
                 (  : ) {
                    ..();
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();


        
         (()  {
             () {
                 {
                    .();
                }  ( ) {
                    .();
                }
                 (  : ) {
                    ..( );
                     {
                        .();
                        .();
                    }  ( ) {
                        .();
                    }
                }
                .();
            }
        }, ).();

    }


}

以上就是synchronized实现两个线程交替运行的解法,欢迎留言交流


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

推荐阅读
TEZNKK3IfmPf