Java多线程通信:交替打印ABAB实例

  

使用wait()和notify()实现Java多线程通信:两个线程交替打印A和B,如ABABAB

        公共类测试{   公共静态void main (String [] args) {   最后PrintAB打?new PrintAB ();   新线程(新Runnable () {   公共空间run () {   (int i=0; i<5,我+ +){   print.printA ();   }   }   }) .start ();   新线程(新Runnable () {   公共空间run () {   (int i=0; i<5,我+ +){   print.printB ();}   }   }) .start ();   }   }   类PrintAB {   私人布尔标志=true;   公共同步空白不要把(){   而(国旗){   尝试{   this.wait ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }}   System.out.print (“A”);   国旗=false;   this.notify ();   }   公共同步空白printB () {   而(国旗){   尝试{   this.wait ();   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   }   System.out.print (" B ");   国旗=true;   this.notify ();}   }      

<强> Java多个线程顺序打印数字

  

要求   

启动N个线程,这N个线程要不间断按顺序打印数字其它。将问题简化为3个线程无限循环打印1到3

  

<强>方法一:使用同步

  

三个线程无序竞争同步锁,如果遇上的是自己的数字,就打印。这种方式会浪费大量的循环

        公开课TestSequential1 {   私人波动int pos=1;   私人波动int数=0;      公共空间>   t - 1 0   2 5793年   5285条t - 3   t - 1 2616   2 33   第28条t - 3   t - 1 22   2 44   第六条t - 3   t - 1 881   2 118358年   247380条t - 3   t - 1 30803   2 29627年   52044条t - 3   …      

<强>方法二:使用同步配合等()和notifyAll()

  

竞争同步锁时使用wait()和notifyAll(),可以避免浪费循环

        公开课TestSequential4 {   私人波动int pos=1;   私人波动int数=0;   私人最终对象obj=新对象();      公共空间>   3尝试   3   3等   2试   2   2等   1试   1   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   1试   1   1等   2 1   2试   2   2等   1条t - 3   3尝试   3   3等   2等   t - 1 2   …      

<强>方法三:使用可重入锁

  

用锁做,非公平锁,三个线程竞争,如果遇上的是自己的数字,就打印。这种方式也会浪费大量的循环

        公开课TestSequential2 {   私人最终锁锁=新的ReentrantLock ();   私人波动int pos=1;   私人波动int数=0;      公共空间>   t - 1 0   2 0   323条t - 3   t - 1 54   2 68964年   97642条t - 3   t - 1 6504   2 100603年   6989条t - 3   t - 1 1313   2 0   183741条t - 3   t - 1 233   2 5081年   164367条t - 3   . .      

<强>方法四:使用可重入锁,启用公平锁

  

和3一样,但是使用公平锁,这种情况下基本上可以做到顺序执行,偶尔会产生多一次循环

  
  

私人最终锁锁=新的ReentrantLock(真正);

     

输出         t - 1 0   2 0   条t - 3 0   t - 1 0   2 0   条t - 3 0   t - 1 0   2 0   条t - 3 0   t - 1 0   2 0   1条t - 3   t - 1 1   2 1   1条t - 3   …

Java多线程通信:交替打印ABAB实例