首先先写一个类,这个类里面有两个方法分别用来让A,B两条线程执行,A执行Run()方法,B执行RunMain()方法
当进入A线程时,Run()方法开始执行,开启A,B两条线程,使之不在进入等待状态,10次后计数器count=10,Run()方法陷入等待状态,这个时候会进入B线程,在里面执行RunMain()方法,开始执行时,开启A,B两条线程,使之不在进入等待状态,15次后计数器count=15,RunMain()方法陷入等待状态,然后回到A线程,执行10次后进入B线程。
在这两个方法中使用的时Lock同步锁(也可以使用synchronized 同步锁)。
public class Communication {
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();
private int count=0;
private int countMain=0;
public void Run(){
lock.lock();
try {
condition.signalAll();
if(count<10){
System.out.println("子线程被执行了"+ ++count+"次");
Run();
}else {
count=0;
System.out.println("子线程执行完成");
condition.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void RunMain(){
lock.lock();
try {
condition.signalAll();
if(countMain<15){
System.out.println("主线程被执行了"+ ++countMain+"次");
RunMain();
}else {
countMain=0;
System.out.println("主线程执行完成");
condition.await();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
定义完两条线程所执行的方法后,在一个新的类中开启A,B两条线程,在开启线程时使用的是匿名内部类,重写run()方法,并开启A,B两条线程。
在交替执行50次A,B线程后代码会结束运行。
class TestCommunication{
public static void main(String[] args) {
Lock lock=new ReentrantLock();
lock.lock();
Communication communication=new Communication();
new Thread(){
@Override
public void run() {
for (int i=0;i<50;i++){
communication.Run();
}
}
}.start();
new Thread(){
@Override
public void run() {
for (int i=0;i<50;i++){
communication.RunMain();
}
}
}.start();
}
}