学习多线程3---线程之间的通信
两个线程交替打印
1.使用synchronized,wait,notify关键字实现
package com.hzm.test; /* * 两个线程交替打印 */ public class Communication { public static void main(String[] args) { // TODO Auto-generated method stub final Business business = new Business(); new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub for(int j = 0 ;j < 50;j++){ business.sub(j); } } }).start(); for(int j = 0 ;j < 50;j++){ business.main(j); } } } class Business{ private boolean bShouldSub = true; public synchronized void sub(int j){ /* * if改为while语句更健壮 */ if(!bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("子"+"i= "+i+"j= "+j); } bShouldSub = false; this.notify(); } public synchronized void main(int j){ if(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("父"+"i= "+i+"j= "+j); } bShouldSub = true; this.notify(); } }
使用condition信号量实现线程之间通信
package com.condition; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionTest { public static void main(String[] args) { // TODO Auto-generated method stub final Business business = new Business(); new Thread(new Runnable(){ @Override public void run() { for(int j = 0 ;j < 50;j++){ business.sub(j); } } }).start(); for(int j = 0 ;j < 50;j++){ business.main(j); } } } class Business{ Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); private boolean bShouldSub = true; public void sub(int j){ /* * if改为while语句更健壮 */ lock.lock(); try{ if(!bShouldSub){ try { //this.wait(); condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("子"+"i= "+i+"j= "+j); } bShouldSub = false; // this.notify(); condition.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void main(int j){ lock.lock(); try{ if(bShouldSub){ try { //this.wait(); condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("父"+"i= "+i+"j= "+j); } bShouldSub = true; //this.notify(); condition.signal(); }finally{ lock.unlock(); } } }
三个线程交替打印,使用信号量实现
package com.test; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreeconditionTest { public static void main(String[] args) { // TODO Auto-generated method stub final Business business = new Business(); new Thread(new Runnable(){ @Override public void run() { for(int j = 0 ;j < 50;j++){ business.sub2(j); } } }).start(); new Thread(new Runnable(){ @Override public void run() { for(int j = 0 ;j < 50;j++){ business.sub3(j); } } }).start(); for(int j = 0 ;j < 50;j++){ business.main(j); } } } class Business{ Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); private int bShouldSub = 1; public void sub2(int j){ /* * if改为while语句更健壮 */ lock.lock(); try{ if(bShouldSub!=2){ try { //this.wait(); condition2.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("子"+"i= "+i+"j= "+j); } bShouldSub = 3; // this.notify(); condition3.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void sub3(int j){ /* * if改为while语句更健壮 */ lock.lock(); try{ if(bShouldSub !=3){ try { //this.wait(); condition3.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("子子"+"i= "+i+"j= "+j); } bShouldSub = 1; // this.notify(); condition1.signal(); }catch(Exception e){ e.printStackTrace(); }finally{ lock.unlock(); } } public void main(int j){ lock.lock(); try{ if(bShouldSub != 1){ try { //this.wait(); condition1.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int i = 0;i < 10;i++){ System.out.println("父"+"i= "+i+"j= "+j); } bShouldSub = 2; //this.notify(); condition2.signal(); }finally{ lock.unlock(); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。