使用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实例