Condition的基本使用
Condition的基本使用可以来代替传统并发锁synchornized wait notify关键字。传统代码改造如下:
任务封装类:
package com.nuanshui.frms.native1.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class ConditionBusiness {
public boolean flag = false;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
//主线程执行
public void executeMain(){
//如果是false.则让线程等待
try{
lock.lock();
while(!flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//否则执行下面逻辑
int m= 0;
for(int i=0;i<5;i++){
m++;
System.out.println("主线程"+Thread.currentThread().getName()+"执行第"+(i+1)+"次");
}
System.out.println("主线程"+Thread.currentThread().getName()+"先执行"+m+"次");
// this.notify();
condition.signal();
flag = false;
}finally {
lock.unlock();
}
}
//子线程执行
public void executeChild(){
//如果是true.则让线程等待
try{
lock.lock();
while(flag){
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int n= 0;
for(int k=0;k<10;k++){
n++;
System.out.println("子线程"+Thread.currentThread().getName()+"执行第"+(k+1)+"次");
}
System.out.println("子线程"+Thread.currentThread().getName()+"先执行"+n+"次");
flag = true;
// this.notify();
condition.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
测试:
package com.nuanshui.frms.native1.thread;
/**
* @author liyy
* @description:线程通信
* @date 2019-03-27 16:08
* @program frms-parent
*/
public class TraditionalThreadCommunicationCondition {
/**
* 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次……如此往返执行50次。
* @param args
*/
public static int mainAll = 0;
public static int childAll = 0;
public static void main(String[] args){
ConditionBusiness conditionBusiness = new ConditionBusiness();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<50;i++){
childAll++;
conditionBusiness.executeChild();
}
System.out.println("子线程总共执行:"+childAll);
}
}).start();
for(int i=0;i<50;i++){
mainAll++;
conditionBusiness.executeMain();
}
System.out.println("主线程总共执行:"+mainAll);
}
}
执行结果: