public class CommunicationRunnable2 implements Runnable{
private Business business;
public CommunicationRunnable2() {
}
public CommunicationRunnable2(Business business) {
this.business=business;
}
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub2(i);
}
}
}
//************************************************************
package com.ygl;
public class CommunicationRunnable3 implements Runnable{
private Business business;
public CommunicationRunnable3() {
}
public CommunicationRunnable3(Business business) {
this.business=business;
}
@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub3(i);
}
}
}
//**********************************************
package com.ygl;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Business {
Lock lock=new ReentrantLock();
Condition condition1 =lock.newCondition();
Condition condition2 =lock.newCondition();
Condition condition3 =lock.newCondition();
private int isShouldSub=1;
//主线程、子线程关联的代码归为一类
public void sub2(int i){
lock.lock();
try{
while(isShouldSub!=2){
try{
condition2.await();
}catch(Exception e){
}
}
for(int j=0;j<10;j++){
System.out.println("sub2 thread"+i+"========"+j);
}
isShouldSub=3;
condition3.signal();
}finally{
lock.unlock();
}
}
//主线程、子线程关联的代码归为一类
public void sub3(int i){
lock.lock();
try{
while(isShouldSub!=3){
try{
condition3.await();
}catch(Exception e){
}
}
for(int j=0;j<20;j++){
System.out.println("sub3 thread"+i+"========"+j);
}
isShouldSub=1;
condition1.signal();
}finally{
lock.unlock();
}
}
public void main(int i){
lock.lock();
try{
while(isShouldSub!=1){
try{
condition1.await();
}catch(Exception e){
}
}
for(int j=0;j<100;j++){
System.out.println("main thread"+i+"========"+j);
}
isShouldSub=2;
condition2.signal();
}finally{
lock.unlock();
}
}
}
//****************************************
package com.ygl;
public class TraditionalThreadCommunication {
public static void main(String[] args) {
Business business=new Business();
CommunicationRunnable2 communicationRunnable2=new CommunicationRunnable2(business);
Thread thread2=new Thread(communicationRunnable2);
CommunicationRunnable3 communicationRunnable3=new CommunicationRunnable3(business);
Thread thread3=new Thread(communicationRunnable3);
thread2.start();
thread3.start();
for(int i=1;i<=50;i++){
business.main(i);
}
}
}